amobbs.com 阿莫电子技术论坛

标题: CC1101嫁给STM32的那些事儿(斑竹,你好意思不给我加精么?) [打印本页]

作者: Louis_Bright    时间: 2013-4-23 15:39
标题: CC1101嫁给STM32的那些事儿(斑竹,你好意思不给我加精么?)
最近有个项目在做升级版,本来是用的TI的CC430F5137(本质是msp430 + CC1101),考虑到功能多且扩展的需求比较明显,所以选择了 STM32F107VC + CC1101.
在调试时,发现问题点还是挺多的,在这里稍微零散的总结一下,希望对有需要的兄弟姐妹有所帮助。

1、由于时间的关系,我可能会零散的写这个帖子,在我自己认为写完之前,我不会回答各位提出的任何问题以保持我资料的完整性(问的问题也许在后续中会提到);
2、错误在所难免,欢迎高手指正;但绝对不欢迎那种只说不好而不讲理由的。(换句话说,你说了自己的理由,哪怕是错误的也欢迎,但就是讨厌那种说一句牛逼讽刺的话就飘过的);
3、本帖子对STM32高手的帮助相当有限,如果阁下是STM32高手而又不愿意浪费时间,请绕行。
4、如果你看了我的帖子真的很有帮助,有想请我吃饭的,可以发消息给我 ^_^.
作者: Louis_Bright    时间: 2013-4-23 15:45
第一个问题,就是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    时间: 2013-4-23 15:52
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    时间: 2013-4-23 16:10
SPI的极性和象位问题。
这个其实还是要看Slave设备。通过看CC1101的datasheet我们可以知道,应该设置成闲时为低(SPI_CPOL_Low),在第一个边缘抓数据(SPI_CPHA_1Edge)。有意思的是,如果你设置成反的(SPI_CPOL_High + SPI_CPHA_2Edge),一般也能跑的,只要速率不是太快。我之前在网上搜到两个Demo程序,一个正确,一个错误,但都能收到数据,开始是很疑惑的。后来分析,负负得正,在速率不是太快的时候恰好能凑上去。
作者: Louis_Bright    时间: 2013-4-23 16:20
SPI的速率问题。
我提这个问题可能很多人不屑一顾,但是,你的程序真的能让你的PSI跑那么高的速率吗?
你用示波器看看你的SPI的CLK波形,很有可能你发一串数据时,两个Byte之间有个挺长的时间间隔。
这里说说我自己的体会,第一,就是我不建议SPI使用中断,直接用查询方式反而会可靠一些,最重要的是,如果你的SPI速率比较快的话,使用中断,反而会使真正的速度(不是CLK速率,而是读写一串数据的速度)会慢下来。
那么接下来,除了初始化程序,其它的自己写的SPI的读写程序,最好不要调用ST的库函数,而直接去操作寄存器,可以省掉函数调用和一些堆栈的时间。
最后,程序也要非常有技巧性,哥写嵌入式程序好歹也有10多年了,还是第一次使用 goto语句(以前并不是不敢用,而是都可以找到替代的方法,觉得容易维护一些),这里就恕我不公布我的程序了,你懂的。

PS:
关于goto,我多说一句,很多人建议废除;其实我是不赞同的。说实在话,程序出问题是程序员的错,而不是goto,就想犯罪是人的错而不是金钱一样。但是另一方面我又极力的建议想办法不使用goto语句,因为它打断了程序的架构,也容易出现bug。goto只有在速度有非常强烈的需求时才能使用。
作者: Louis_Bright    时间: 2013-5-4 15:48
虽然斑竹没有给我加精,也没有网友请我吃饭,但本着做事有始有终的原则,继续说说CC1101嫁给STM32的这场婚姻……
作者: Louis_Bright    时间: 2013-5-4 15:58
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啊!
作者: newidea    时间: 2013-5-4 16:00
支持一下。能够写自己的切身体会是很难得的。
作者: Louis_Bright    时间: 2013-5-4 16:06
然后要说说CC1101的寄存器和一些操作。
简单说,操作主要有:
1、single write
2、single read
3、burst write
4、burst read
5、strobe

本来看上去没有什么,但变态的是有些寄存器和strobe命令的地址是重叠的。
深刻理解英文datasheet page70(SWRS061H)的那个图。
主要是有几个坑爹的事情:
1、0x30~0x3D的位置 single read,也会是strobe的命令(最坑爹的);
2、0x3E,0x3F位置的burst read,其实是读FIFO。
作者: Louis_Bright    时间: 2013-5-4 16:23
第三个问题,寄存器配置。
有人说,不是有专门的TI提供的软件么?没错,我要说的就是这个软件,叫做 “Smart RF studio”。
只是,这个软件我本身也还没完全弄明白,希望有高手能补充。
1、设计时,要注意平衡,Data rate越高,那么灵敏度就会越低;
2、频段是有限的(比如433M其实是433.07MHz~433.92MHz),channel spacing越宽则能支持的channel就越少;
3、channel spacing至少要是data rate的1倍,当然间隔越大,越没那么容易干扰
4、个人还不是太明白“RX filter BW” 和 “Deviation”,我最初设计时是参考demo的做法,希望有牛人来解释一下。
5、注意中心频率的问题,以433M为例,你的频率间隔是50K,那么Base frequency应该是433.07M + 0.05M = 433.12M。
作者: Louis_Bright    时间: 2013-5-4 16:30
第四个问题,正常工作的模式设计。
简单说,是查询模式还是中断模式?
我在网上搜到的程序,包括TI官方的demo程序,都是查询模式,这个可以演示一下收发的功能。
但是,实际情况却是:天知道它什么时候来RF信号啊?
所以这里我要说的是中断模式。
CC1101的GDO是可以做这些功能的,让它接SMT32的外部中断。
深刻理解因为英文datasheet page 62上的那个表格。
作者: Louis_Bright    时间: 2013-5-4 16:41
有两种方式:(假定GDO没取反)
方式一、GDO配置成0x06.
这种模式,当处于接收状态,收到一个同步字时会变高,当收到一帧数据或者中间出错(地址错,溢出等)会变低。我们只要配置SMT32的外部中断为下降沿中断,就可以在中断程序中去读RX FIFO,能正确读出就去处理。
方式二、GDO配置 0x07 --> 0xXX
这种方式需要在切换收/发的时候还要去改变这个寄存器,比较烦而且容易出错,好处是不会产生过多的STM32外部中断。

个人推荐:
1、如果系统是主从模式,用方式一吧;
2、如果系统是星型结构,用方式二吧;
作者: Louis_Bright    时间: 2013-5-4 16:43
第五个问题,载波侦听。
也就是说,你在发RF信号的时候,要看看这个频段是否有人在用,如果有人在用的话,就再等等,等待时间太长就timeout吧!

CC1101_PKTSTATUS(0x38)的BIT4
作者: Louis_Bright    时间: 2013-5-4 16:44
其实CC1101嫁给STM32还有一些琐碎的事,但估计都不是那么坑爹,八卦到此结束!
作者: excellentmary    时间: 2013-5-6 20:02
斑竹,为何我的也是spi接口,然后GD的中断,但是仅能够接收一次发送过来的数据,其他情况接收得到不准;而且我在线运行,每次能都进中断,一全速运行就进不了……麻烦解释哈
作者: Louis_Bright    时间: 2013-5-7 09:00
excellentmary 发表于 2013-5-6 20:02
斑竹,为何我的也是spi接口,然后GD的中断,但是仅能够接收一次发送过来的数据,其他情况接收得到不准;而 ...

1、哥不是斑竹
2、中断……你设置的是什么中断?你进中断是否清除掉了中断标志?
3、没听明白你的描述
作者: Louis_Bright    时间: 2013-5-7 09:01
第三点,可能还是SPI的配置的问题,详细看看我前面关于SPI设置的描述(尤其相位等问题)
作者: dianzimingong    时间: 2013-5-7 09:11
想要精,是需要条件滴~~~~
作者: newselect    时间: 2013-5-7 09:21
LZ资料整理一下
作者: excellentmary    时间: 2013-5-7 19:49
呵,楼主哈!1、设置的GD两个管脚的,主要用GDO1,仅仅是起个告知数据来临的作用,然后RFReceivePacket(wireless_union_in.parameter+1,&len);函数读取的;
                   2、 进中断是关了标志位的,只是我单步执行可以接收到发送来的数据……但也仅有次数pktLen 是和我发送的字节数是一致的(pktLen = halRfReadReg(TI_CCxxx0_RXFIFO); )
                    3、 此外 无线模块发热蛮厉害,是数据过多溢出原因吗?
                    4、个人猜想是不是配置 和 中间发送接收的延时的问题,但是初始化的配置我是找51 全部一致过来的 PS:发送应该是没有问题的,我之前接收端是在51上写的,可以正常接收发送,现在仅仅是移植到stm32上,所有配置都一样,实在搞不懂为啥……
作者: Louis_Bright    时间: 2013-5-7 20:40
excellentmary 发表于 2013-5-7 19:49
呵,楼主哈!1、设置的GD两个管脚的,主要用GDO1,仅仅是起个告知数据来临的作用,然后RFReceivePacket(wir ...

GDO1 设置成多少(0x06?)
作者: ksniper    时间: 2013-5-7 20:49
爪机无力,马克先
作者: excellentmary    时间: 2013-5-7 21:01
是的 0x06  用的是GDO2  和 GDO0  两个连着外部中断,其他spi配置和大哥前面讲的一样,那么,小弟那些问题……
作者: Louis_Bright    时间: 2013-5-7 21:08
1、看看是否有其它设备在使用这个频段,我之前测试也遇到过这个问题,就是不断收到同步字,但不是发给自己的,所以一直会有中断,但读RX FIFO的长度为0.
2、不知道你是否加了PA之类的放大器,不过我的测试不至于有太大的发热才对,检查一下硬件。(哥做软件的,硬件的有另外的哥们来搞,我们开始也发热,后来搭档硬件上搞定了)
3、如果是加了放大之类的,先去掉试试(我们开始就这样我软件先测试,他去找硬件问题去了)。
4、我们的设备用了GDO0来控制PA的收发,看你的是不是也是这样。
作者: jcrorxp    时间: 2013-5-7 21:14
Louis_Bright 发表于 2013-5-7 21:08
1、看看是否有其它设备在使用这个频段,我之前测试也遇到过这个问题,就是不断收到同步字,但不是发给自己 ...

好贴!!

最近我也调个周立功的433  CC1100 模块~


不过调通了~  但是代码而已~


还没钻研透彻
作者: 357853730    时间: 2013-5-7 21:25
说的挺详细的
作者: gzrldt    时间: 2013-5-7 22:17
经验之谈,感谢分享
作者: excellentmary    时间: 2013-5-8 15:41
433M 应该无人用,我每次换成51节点时候就能和网关连接顺畅,用现在调试的M3 就没发现什么数据……
作者: qjs412_avr    时间: 2013-5-10 19:23
Louis_Bright 发表于 2013-5-7 21:08
1、看看是否有其它设备在使用这个频段,我之前测试也遇到过这个问题,就是不断收到同步字,但不是发给自己 ...

请教楼主,我也是使用中断模式接收数据,cc1101工作在WOR模式,接收数据后,转成发送状态时,数据不能正常发送,不知为何,(我用另一块CC1101监视所有的CC1101的通信数据)
作者: zgxcom123    时间: 2013-5-10 22:35
过来顶顶楼主!~ 哈哈!!

stm32的SPI是个硬伤,跟着楼主从实战学习
作者: sun92845166    时间: 2013-5-10 22:54
支持一下。能够写自己的切身体会是很难得的。
作者: wujiaodalou911    时间: 2013-5-10 23:26
支持楼主,干的不错。。
作者: huangrui    时间: 2013-5-10 23:52
楼主说的不错!支持一下
作者: linliangqiu    时间: 2013-5-11 00:40
Louis_Bright 发表于 2013-4-23 15:45
第一个问题,就是SPI的接口。
这个问题看似简单,而当CC1101嫁给STM32后就变得不简单了。
首先是SPI接口的I ...

一般应用对这些芯片的SPI的时候都是CS是自己控制的,没有哪家的芯片CS可以完全硬件控制的。
作者: biansf2001    时间: 2013-5-11 04:14
用过。加了大功率,距离还是近,不得不放弃了。

往下走吧。前期都是小菜。距离和功耗才是王道。
作者: creep    时间: 2013-5-11 11:39
Louis_Bright 发表于 2013-4-23 16:20
SPI的速率问题。
我提这个问题可能很多人不屑一顾,但是,你的程序真的能让你的PSI跑那么高的速率吗?
你用 ...

“你用示波器看看你的SPI的CLK波形,很有可能你发一串数据时,两个Byte之间有个挺长的时间间隔。”
这个深有感触,用STM32的SPI2读写SD卡,SPI的时钟使用18MHZ,一次读写512字节,用示波器观察CLK的波形发现真正读写数据的那8个CLK的时钟占用时间只有445ns左右,这个时间是正确的。
但是2个byte之间的时间竟然有4~5us,是读写数据占用时间的10倍左右,这样就造成了写一个扇区(512字节)速度很慢,一直没有找到好的解决方法。

SPI是使用查询的方式没有使用中断,SPI初始化和读写的函数都是调用ST的库函数,写数据就是反复调用SPI读写那个函数。
想请教下,为了把SPI的速度提上去,除了把读写SPI的那个函数用寄存器操作外,很想知道你说的使用goto语句是怎样实现对SPI速度的优化的。谢谢!!
作者: bbssilverkey    时间: 2013-5-11 12:05
同问,如何提高速度?
作者: kaimpf    时间: 2013-5-11 13:16
一个标题搞得跟菜农什么全球征婚似的,技术东西严肃点吧,瞎扯的话,可以写stm32与xxx搞基,与yyy搞菊花!
作者: ARM2012    时间: 2013-7-3 00:10
请教传输距离有没有得优化,好像隔了一面墙就出问题了
作者: redora    时间: 2013-7-8 15:23
mark 支持
作者: helongdm    时间: 2013-7-8 16:37
请问楼主你的空中速率是多少    cc1101极限是500K    在四五百K的情况下能传多远     加个1W功放呢   
作者: youmeng    时间: 2013-8-13 11:07
正在调试 收益匪浅啊 我也得注意一下啊
作者: 277955973    时间: 2013-8-13 13:04
CC1101L有没有碰到锁死的状态,中断变高电平了就下不来了
作者: xiefy21    时间: 2013-8-13 21:09
mark……
顶一个…
作者: penguinwang2008    时间: 2014-1-8 19:14
能发个工程文件瞧瞧嚒……我的邮箱是376830994@qq.com,楼主好人!
作者: flyforyou85    时间: 2014-1-8 19:20
先顶下楼主,STM32的那个SPI,我也搞了好久。学习!
作者: liufabing    时间: 2014-1-11 00:21
顶一下,之前也用了一下CC1101,有个命令定义打错,查问题找了好久.
作者: 涵潇舒雅    时间: 2014-1-14 13:25
好东西!!!!mark
作者: 涵潇舒雅    时间: 2014-1-14 13:25
好东西!!!!mark
作者: 闲鱼翻身    时间: 2014-4-3 11:27
想求大侠的工程看看,最近搞CC1101,发送端发送了,可是接收端没有接收到,不知是哪的问题呢,没有死在GDO0那些的情况啊
作者: 闲鱼翻身    时间: 2014-4-3 11:27
邮箱123238334@qq.com  感谢了
作者: green-hand    时间: 2014-7-15 10:30
非常有用哈~
作者: 503126063    时间: 2014-7-15 13:14
MARK,谢谢~~~
作者: dmzy    时间: 2014-7-15 15:51
MARK                           
作者: yht0312    时间: 2014-7-15 16:36
CC1101的寄存器超多,希望大家在搞它的驱动的时候,最好仔细阅读其英文文档,严格按照其文档说明做驱动就没有问题了。
作者: hemeizhi    时间: 2014-7-15 17:28
mark
一下
作者: zhiyuanzhitian    时间: 2014-7-15 20:53
mark...后面用到。。。
作者: 天行者    时间: 2014-7-15 23:40
高手顶一下。
作者: Sem    时间: 2014-7-16 08:53
我最近長搞cc1110, 其實跟cc1101是一脈相承的, 只是裡面有包顆8051,

在rf方面, 我的建議是MARC_STATE要去看,  一般 Tx Rx 切換, 我會先切 Idle, 避免發生 RXFIFO_OVERFLOW 或是 TXFIFO_UNDERFLOW,
因為這兩種狀況都要先切換回idle, 後續的rf才能動作, 索性每次切換直接先切 Idel.

CALIBRATE就看個人喜好什麼時候做, 有人5-10次Tx或Rx做一次, 我是比較怕頻偏, 所以是每次切換RX TX都會做.

至於傳輸距離, 要去看天線的場型 天線與晶片的匹配 傳送的DataRate 暫存器靈敏度的設置 發送功率的設置.....


作者: xhp0912    时间: 2014-9-26 11:34
写的很好,每个人的调试历程都是这样的,能让人少走弯路
作者: imliyucai    时间: 2014-9-26 11:45
刚准备用 CC430F5137。学习学习。
作者: chinazhaoyl    时间: 2014-9-26 11:49
谢谢分享!
作者: wuwei520    时间: 2014-9-26 12:59
几年前搞过CC1101,也是摸索了很久。
作者: DepravedLucien    时间: 2014-9-26 13:50
顶起来           
作者: 罗敏爱之恋    时间: 2014-9-26 13:52
谢谢分享,现在还没用到,等用到了,再来精读,感谢!
作者: fengbuding    时间: 2014-11-6 09:12
mark!               
作者: 胥華孑    时间: 2015-4-16 17:45
谢谢LZ分享,新手学习了
作者: myiccdream    时间: 2015-4-16 18:15
ARM2012 发表于 2013-7-3 00:10
请教传输距离有没有得优化,好像隔了一面墙就出问题了

加外部功放管。提升发射功率。或者换SI4xxx 能达到2W还是多少的芯片
作者: stm32study    时间: 2015-4-17 15:25
myiccdream 发表于 2015-4-16 18:15
加外部功放管。提升发射功率。或者换SI4xxx 能达到2W还是多少的芯片

silicon labs的SI4432,SI4438,SI4463的最大功率输出20dBm,也就是100mW,可到不了2W.我TI的和Silabs的芯片都用过,就射频性能而言,个人感觉TI的CC系列某些芯片还是有点差。CC有的功放芯片射频不太容易调。当然一般没有微波仪器,无法测试的朋友可能不关注这个。但如果做产品,建议大家还是要用仪器仔细调试。
作者: yzh    时间: 2015-4-17 21:36
不错,楼主详细的分享了自己的经验,看了以后,自己可以少走弯路了,谢谢!
作者: godlovemei    时间: 2015-4-17 22:47
收藏了,哈哈
作者: 蓝蓝的恋    时间: 2015-4-18 09:43
先学习了,楼主有没有搞过433m组网呢
作者: Taoj    时间: 2015-11-25 09:53
能给个发送数据格式,能给个example 吗   比如 55D391D39108AABBCCDD11223344    55  前导码  D391 是同步字  08是数据长度  后面是数据
作者: 大笨蛋1990    时间: 2015-11-25 19:28
留名                     
作者: thomascao    时间: 2016-3-7 23:37
学习了
作者: MegaHealth    时间: 2016-3-8 09:37
感觉用ST的库不管是SPI还是I2C的中断都比查询慢太多了
作者: 1328616904    时间: 2016-3-8 11:37
楼主,我任务这都不是关键问题,关键问题是怎么让CC1101 组网
作者: eva_yang    时间: 2017-8-2 00:38
1328616904 发表于 2016-3-8 11:37
楼主,我任务这都不是关键问题,关键问题是怎么让CC1101 组网

你好,请问你的组网搞定了吗?




欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4