CC1101嫁给STM32的那些事儿(斑竹,你好意思不给我加精么?)

2019-12-26 18:55发布

最近有个项目在做升级版,本来是用的TI的CC430F5137(本质是msp430 + CC1101),考虑到功能多且扩展的需求比较明显,所以选择了 STM32F107VC + CC1101.
在调试时,发现问题点还是挺多的,在这里稍微零散的总结一下,希望对有需要的兄弟姐妹有所帮助。

1、由于时间的关系,我可能会零散的写这个帖子,在我自己认为写完之前,我不会回答各位提出的任何问题以保持我资料的完整性(问的问题也许在后续中会提到);
2、错误在所难免,欢迎高手指正;但绝对不欢迎那种只说不好而不讲理由的。(换句话说,你说了自己的理由,哪怕是错误的也欢迎,但就是讨厌那种说一句牛逼讽刺的话就飘过的);
3、本帖子对STM32高手的帮助相当有限,如果阁下是STM32高手而又不愿意浪费时间,请绕行。
4、如果你看了我的帖子真的很有帮助,有想请我吃饭的,可以发消息给我 ^_^.
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
77条回答
Louis_Bright
1楼-- · 2019-12-26 19:37
第一个问题,就是SPI的接口。
这个问题看似简单,而当CC1101嫁给STM32后就变得不简单了。
首先是SPI接口的IO口配置的问题,STM32的SPI口有两种模式,一种是带CS脚(4线模式,硬件控制CS),一种是不带CS脚(3线模式,软件控制CS),个人推荐直接用3线模式,有两个原因,我测试的时候发现如果用硬件CS的时候会出错,也许是因为Slave设备需要CS拉低一点时间操作比较安全,第二个原因是正式的操作时,有可能要用到CS脚(看CC1101的datasheet),好了,我们选择SPI_NSS_Soft
Louis_Bright
2楼-- · 2019-12-26 21:51
SCK 和 MOSI 引脚设置为外部推挽输出GPIO_Mode_AF_PP;这个大家都知道;问题是MISO设置成什么为好呢?可以肯定是设为输入,但是是上拉输入(GPIO_Mode_IPU),下拉输入(GPIO_Mode_IPD)还是悬空输入(GPIO_Mode_IN_FLOATING)?这个一般要看实际外部Slave设备的端口能力,一般都是设置为悬空输入,但在接CC1101的时候,个人建议使用上拉输入(GPIO_Mode_IPU),原因就在于TI系列的芯片的SPI口,会要求去判断这个口为低才表示空闲。
Louis_Bright
3楼-- · 2019-12-26 22:11
 精彩回答 2  元偷偷看……
Louis_Bright
4楼-- · 2019-12-27 00:33
SPI的速率问题。
我提这个问题可能很多人不屑一顾,但是,你的程序真的能让你的PSI跑那么高的速率吗?
你用示波器看看你的SPI的CLK波形,很有可能你发一串数据时,两个Byte之间有个挺长的时间间隔。
这里说说我自己的体会,第一,就是我不建议SPI使用中断,直接用查询方式反而会可靠一些,最重要的是,如果你的SPI速率比较快的话,使用中断,反而会使真正的速度(不是CLK速率,而是读写一串数据的速度)会慢下来。
那么接下来,除了初始化程序,其它的自己写的SPI的读写程序,最好不要调用ST的库函数,而直接去操作寄存器,可以省掉函数调用和一些堆栈的时间。
最后,程序也要非常有技巧性,哥写嵌入式程序好歹也有10多年了,还是第一次使用 goto语句(以前并不是不敢用,而是都可以找到替代的方法,觉得容易维护一些),这里就恕我不公布我的程序了,你懂的。

PS:
关于goto,我多说一句,很多人建议废除;其实我是不赞同的。说实在话,程序出问题是程序员的错,而不是goto,就想犯罪是人的错而不是金钱一样。但是另一方面我又极力的建议想办法不使用goto语句,因为它打断了程序的架构,也容易出现bug。goto只有在速度有非常强烈的需求时才能使用。
Louis_Bright
5楼-- · 2019-12-27 02:48
虽然斑竹没有给我加精,也没有网友请我吃饭,但本着做事有始有终的原则,继续说说CC1101嫁给STM32的这场婚姻……
Louis_Bright
6楼-- · 2019-12-27 05:41
OK,前面说了STM32的SPI的问题,我们接下来再说说CC1101的问题:
第一个问题是MISO引脚,有三个重点:
1、通过SPI操作CC1101的时候,要先判断MISO是否为低(为高则说明CC1101处于忙或者非激活状态),这是之前说CS用SPI_NSS_Soft的原因之一。另外也是我建议引脚配置GPIO_Mode_IPU的原因。
2、CC1101的MISO是可以设置成GDO1,不过默认是做MISO。
3、即使作为MISO,系统的状态也要使晶振起振(用strobe命令),才能有数据输出到STM32中,所以不仔细看datasheet,可能会发现读出来的数据老是0啊!

一周热门 更多>