本帖最后由 dwj0 于 2015-2-3 21:51 编辑
最近使用STM32F030F4制作了一个产品,其中使用SPI驱动无线芯片CC1120,初始化完SPI后,却发现对CC1120的初始化操作总是不能成功
SPI的写数据函数是照搬STM32F103C8的,如下:
- static u8 SpiWriteRead(u8 Data)
- {
- while (!(SPI->SR&SPI_SR_TXE));
- SPI->DR=Data;
- while (!(SPI->SR&SPI_SR_RXNE));
- return SPI->DR;
- }
复制代码
但把这个函数用软件模拟SPI时序又可以成功对CC1120初始化,调试半天无果,百思不得其解,只能求助于网络。
用度娘在换了N多关键词后, 终于在一个论坛中找到一个帖子,说的是STM32F0XX对SPI操作进行了优化,当使用 SPI->DR=Data; 发送数据时,其发送的是16位数据,发送8位数据时, 要使用 *(uint8_t*)&SPI->DR=Data;
修改之,发现8位数据发送完后,程序在 while (!(SPI->SR&SPI_SR_RXNE)); 卡死。
单步调试发现发送数据后,RXNE位并不能置位,于是用 while ((SPI->SR&SPI_SR_BSY)); 代替。
成功。
最后函数如下:
- static u8 SpiWriteRead(u8 Data)
- {
- while (!(SPI->SR&SPI_SR_TXE));
- *(uint8_t*)&SPI->DR=Data;
- while ((SPI->SR&SPI_SR_BSY));
- return *(uint8_t*)&SPI->DR;
- }
复制代码
下班回家,写了个小函数,用SPI不停的发送0x55,接上示波器查看波形
主函数里不停调用 SpiWrite(0x55); 不开任何中断。
16位数据发送函数如下:
- static void SpiWrite(u8 Data)
- {
- while (!(SPI->SR&SPI_SR_TXE));
- SPI->DR=Data;
- }
复制代码
波形如下,确实发送了16个SCK时钟
新建文件2.gif (6.32 KB, 下载次数: 0)
下载附件
2015-2-3 21:38 上传
而其它的预分频没有这个问题。这样发送一个字节数据,歇一个字节数据的时间,又百思不得其解了。
*(uint8_t*)&SPI->DR=Data;
强制转为8位发生,我记得F103好像还要在后面跟一句读RX忙标志的语句。
一周热门 更多>