最近在用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为主设备,如果这个不置位,单工模式下的数据无法发送,手册说的不是很清楚
我用示波器看了下整个的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]
一周热门 更多>