关于 STM32F103R8T6 硬件SPI2 的 单工模式通信问题

2019-10-15 06:52发布

最近在用A7139无线模块,该模块是SPI通信,不过数据口是双向的,即SIMO/SOMI公用一个SDIO口。

软件SPI一切OK,所以尝试用硬件SPI驱动。

关于STM32的SPI有这么个功能,见下图:


当我启用接收数据的模式时,就出问题了,一直是数据接收溢出,即 ( SPI2->SR == 0x43) 

各种尝试均无果,请求各位指点,在此谢过!

以下为配置SPI的部分代码:

[mw_shl_code=c,true]void A7139_Ports_Init(Uint8 bdr) { Uint16 tmp = 0; //------------------------------单工硬件SPI RCC->APB2ENR |= 1<<3;//使能GPIOB时钟 RCC->APB1ENR |= 1<<14;//使能SPI2时钟 GPIOB->CRH &= 0x0F00FFFF;//PB15,PB13推挽复用输出,PB12 GPIOB->CRH |= 0xB0B30000; GPIOB->ODR |= (1<<15)|(1<<13)|(1<<12); // SPI2->CR1 = 0; tmp |= (1<<2);//主设备 tmp |= (1<<15);//BIDIMODE=1 tmp |= (1<<14);//BIDIOE=1 // tmp |= (0<<11);//8Bit tmp |= (1<<9);//软件NSS tmp |= (1<<8); // SPI2->CR1 |= (0<<7);//MSB tmp |= (bdr<<3);//设置SPI2波特率 // SPI2->CR1 |= (0<<1);//空闲SCK保存低电平 // SPI2->CR1 |= (0<<0);//第一个时钟边沿采样 tmp |= (1<<6);//使能SPI SPI2->CR1 = tmp; SPI2->CR2 |= (1<<5);//使能 错误中断 SPI2->CR2 |= (1<<6);//RXNE 接收中断使能 MY_NVIC_Init(1, 1, SPI2_IRQChannel, 3); // SPI2->DR = 0xFE; }[/mw_shl_code]
不知道  SPI 读  部分的代码怎么写,自己各种尝试都不行...

另外有个需要注意的地方是:SPI2->CR1 |= (1<<2);//设置SPI为主设备,如果这个不置位,单工模式下的数据无法发送,手册说的不是很清楚
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
10条回答
人人
2019-10-15 08:01
问题我终于解决了
我用示波器看了下整个的SPI读写时序:NSS / SCK / MOSI
由于我启用的是软件NSS管理,当时的  SPI写  代码如下:
[mw_shl_code=c,true]void StrobeCMD(Uint8 cmd) { SCS = 0; while((SPI2->SR&0x02)!=0x02);//SPI TX Busy SPI2->DR = cmd; SCS=1; } [/mw_shl_code] 这里面有个问题:由于SPI发送数据是硬件处理,所以当执行了下面发送数据的2句话后
while((SPI2->SR&0x02)!=0x02);//SPI TX Busy
SPI2->DR = cmd;
就立即执行了  SCS = 1;
而此时 硬件SPI的数据仍在发送,此时的片选信号已经提前结束了,所以 SPI写 根本就没写进去,当然也就读不出任何有效数据了!
犯同样错误的朋友们注意啦
[mw_shl_code=c,true][/mw_shl_code]

一周热门 更多>