接触STM32已经3个月了。
期间是下了不少功夫看资料,对STM32的了解逐渐明了。
最近我在用SPI做通讯控制。
出现了一个让人郁闷也很想不通的问题。
STM32 SPI1用于从机接收数据,SPI2用于主机发送数据,在调试的时候一直让J-LINK仿真器联机我的MCU。中间为了联机调试方便。在我去掉J-LINK后,准备交工的时候,我再次试机。出现数据不正常现象。我赶紧插上J-LINK调试,发现又正确了。
后面反复实验,我发现只要J-LINK联机(注意不打开联机调试,只是简单的联机。J-LINK通电状态)。我的数据正常。
为了保证设计工作正常,我加班加点的去找问题,最后我把程序中SPI1的通讯方式改为了两线全双工通讯,MISO悬空。在去掉J-LINK的情况下就正常了。可是在J-LINK联机的情况下错误。我联机调试发现接收的SPI1->DR数据被乘以2。我当时就晕了。
马上要交工了。我硬着头皮把设计交上去,焦急的等待。
我发这个帖只是想大家讨论一下。
现在我把我的SPI配置给大家看看,回头我会继续去处理这个问题。有新发现再给大家说明。还有一点忘记说了,我上位机是通过GY7502_USB-SPI适配器给MCU的SPI1发送数据,这个适配器市面上买500元左右。比较好用。
SPI_InitTypeDef SPI_InitStructure;
SPI_Cmd(SPI1,DISABLE); //失能SPI2,数据传输
SPI_Cmd(SPI2,DISABLE); //失能SPI2,数据传输
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode=SPI_Mode_Slave;//设置SPI工作模式:设置为从SPI
SPI_InitStructure.SPI_DataSize=SPI_DataSize_16b;//设置SPI的数据大小:SPI发送接收8位帧结构
SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low; //选择了串行时钟的稳态:时钟悬空低
SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;//数据捕获于第二个时钟沿
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;//SPI_NSS_Soft;//NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_4; //定义波特率预分频的值:波特率预分频值为256
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
//SPI_InitStructure.SPI_CRCPolynomial=7;//CRC值计算的多项式
SPI_Init(SPI1,&SPI_InitStructure);//根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE, ENABLE);//使能接收缓存非空中断屏蔽
SPI_Cmd(SPI1,ENABLE);//使能SPI2外设
//SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
SPI_InitStructure.SPI_Direction=SPI_Direction_1Line_Tx;//设置SPI单向或者双向的数据模式:SPI设置为单线双向发送
SPI_InitStructure.SPI_Mode=SPI_Mode_Master;//设置SPI工作模式:设置为主SPI
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;//设置SPI的数据大小:SPI发送接收8位帧结构
SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low; //选择了串行时钟的稳态:时钟悬空低
SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;//数据捕获于第一个时钟沿
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;//SPI_NSS_Soft;//NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_2; //定义波特率预分频的值:波特率预分频值为2
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
//SPI_InitStructure.SPI_CRCPolynomial=7;//CRC值计算的多项式
SPI_Init(SPI2,&SPI_InitStructure);//根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
SPI_Cmd(SPI2,ENABLE);//使能SPI2外设 |