最近有个项目在做升级版,本来是用的TI的CC430F5137(本质是msp430 + CC1101),考虑到功能多且扩展的需求比较明显,所以选择了 STM32F107VC + CC1101.
在调试时,发现问题点还是挺多的,在这里稍微零散的总结一下,希望对有需要的兄弟姐妹有所帮助。
1、由于时间的关系,我可能会零散的写这个帖子,在我自己认为写完之前,我不会回答各位提出的任何问题以保持我资料的完整性(问的问题也许在后续中会提到);
2、错误在所难免,欢迎高手指正;但绝对不欢迎那种只说不好而不讲理由的。(换句话说,你说了自己的理由,哪怕是错误的也欢迎,但就是讨厌那种说一句牛逼讽刺的话就飘过的);
3、本帖子对STM32高手的帮助相当有限,如果阁下是STM32高手而又不愿意浪费时间,请绕行。
4、如果你看了我的帖子真的很有帮助,有想请我吃饭的,可以发消息给我 ^_^.
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
这个问题看似简单,而当CC1101嫁给STM32后就变得不简单了。
首先是SPI接口的IO口配置的问题,STM32的SPI口有两种模式,一种是带CS脚(4线模式,硬件控制CS),一种是不带CS脚(3线模式,软件控制CS),个人推荐直接用3线模式,有两个原因,我测试的时候发现如果用硬件CS的时候会出错,也许是因为Slave设备需要CS拉低一点时间操作比较安全,第二个原因是正式的操作时,有可能要用到CS脚(看CC1101的datasheet),好了,我们选择SPI_NSS_Soft
我提这个问题可能很多人不屑一顾,但是,你的程序真的能让你的PSI跑那么高的速率吗?
你用示波器看看你的SPI的CLK波形,很有可能你发一串数据时,两个Byte之间有个挺长的时间间隔。
这里说说我自己的体会,第一,就是我不建议SPI使用中断,直接用查询方式反而会可靠一些,最重要的是,如果你的SPI速率比较快的话,使用中断,反而会使真正的速度(不是CLK速率,而是读写一串数据的速度)会慢下来。
那么接下来,除了初始化程序,其它的自己写的SPI的读写程序,最好不要调用ST的库函数,而直接去操作寄存器,可以省掉函数调用和一些堆栈的时间。
最后,程序也要非常有技巧性,哥写嵌入式程序好歹也有10多年了,还是第一次使用 goto语句(以前并不是不敢用,而是都可以找到替代的方法,觉得容易维护一些),这里就恕我不公布我的程序了,你懂的。
PS:
关于goto,我多说一句,很多人建议废除;其实我是不赞同的。说实在话,程序出问题是程序员的错,而不是goto,就想犯罪是人的错而不是金钱一样。但是另一方面我又极力的建议想办法不使用goto语句,因为它打断了程序的架构,也容易出现bug。goto只有在速度有非常强烈的需求时才能使用。
第一个问题是MISO引脚,有三个重点:
1、通过SPI操作CC1101的时候,要先判断MISO是否为低(为高则说明CC1101处于忙或者非激活状态),这是之前说CS用SPI_NSS_Soft的原因之一。另外也是我建议引脚配置GPIO_Mode_IPU的原因。
2、CC1101的MISO是可以设置成GDO1,不过默认是做MISO。
3、即使作为MISO,系统的状态也要使晶振起振(用strobe命令),才能有数据输出到STM32中,所以不仔细看datasheet,可能会发现读出来的数据老是0啊!
一周热门 更多>