STM32F107的SPI3通讯不上外设

2019-07-20 20:52发布

123456.JPG
上图是外设的SPI波形图
STM32F107的配置如下:
能看到MCLK和MOSI,CS的波形,怎么就没有回应呢??

        SPI_InitTypeDef  SPI_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag , 开启swd

       



        /* 使能SPI1和GPIOA、GPIOB的RCC时钟*/
        //RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//RCC_APB1Periph_SPI3
        //RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
        //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
        GPIO_PinRemapConfig(GPIO_Remap_SPI3,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);

        SPI_Cmd(SPI3,DISABLE);
        /*!初始化时钟信号线SCK */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PC10
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init(GPIOC, &GPIO_InitStructure);

        /*初始化SPI_FLASH_SPI管脚: MOSI */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;//PC12
        GPIO_Init(GPIOC, &GPIO_InitStructure);

        /*初始化SPI_FLASH_SPI管脚: MISO */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PC11
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//GPIO_Mode_Out_OD;
        GPIO_Init(GPIOC, &GPIO_InitStructure);

        /*初始化片选信号管脚: /CS*/
        #if 1
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//PA4
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        #endif
#if 1

        /*拉高片选信号*/
        SPI_FLASH_CS_HIGH();
       
        /* SPI1初始化配置*/
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;  //主从模式选择,SCK信号有主机产生
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //SPI通信数据的大小
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;         //时钟极性
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;   //时钟相位
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//SPI_NSS_Soft;          //片选信号,硬件模式还是软件模式
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;        //SPI分频值,分频后的值为SCK的时钟频率
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //选择SPI通信时,是高位数据在前还是低位数据在前
        SPI_InitStructure.SPI_CRCPolynomial = 0;        //与CRC校验有关
        SPI_Init(SPI3, &SPI_InitStructure);

        /*使能SPI1 */
        SPI_Cmd(SPI3, ENABLE);

        /*唤醒SPI FLASH*/
        //SPI_Flash_WAKEUP();
        #endif

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
xuande
1楼-- · 2019-07-20 22:23

能看到CLK、MOSI、CS的波形,这边“基本”没问题。
现在要考察另一边。
上面一堆代码基本没必要贴出来。

SPI外设器件很多,操作过程五花八门。
看你是什么器件。

比如,可能要先发出命令,然后对方才会有反应。

midisamboy
2楼-- · 2019-07-20 23:04
xuande 发表于 2016-4-7 19:39
能看到CLK、MOSI、CS的波形,这边“基本”没问题。
现在要考察另一边。
上面一堆代码基本没必要贴出来 ...

你好,我是发送了,读ID的指令,
SPI_FLASH_CS_LOW();

SPI_FLASH_SendByte(0x22);
SPI_FLASH_SendByte(0x00);
SPI_FLASH_SendByte(0x02);
SPI_FLASH_SendByte(0xDB);
SPI_FLASH_SendByte(0xFF);
Temp0 = SPI_FLASH_SendByte(0xA5);
Temp1 = SPI_FLASH_SendByte(0xA5);
Temp2 = SPI_FLASH_SendByte(0xA5);

SPI_FLASH_CS_HIGH();
就是MISO,没什么反应
xuande
3楼-- · 2019-07-21 00:17

示波器查mosi,一看数据对不对,二看时序对不对。

midisamboy
4楼-- · 2019-07-21 00:27
 精彩回答 2  元偷偷看……
xuande
5楼-- · 2019-07-21 05:07

首先看CLK边沿与数据位的关系,
比如,数据在哪个边沿出现,哪个边沿要保持。

其次看时间关系,
比如,数据要在边沿前面多久出现,要保持多久。

细节很多。


midisamboy
6楼-- · 2019-07-21 05:28
 精彩回答 2  元偷偷看……

一周热门 更多>