新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > CC1101 433無線模塊,STM8串口透傳

        CC1101 433無線模塊,STM8串口透傳

        作者: 時間:2016-11-19 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/201611/318109.htm

        原理圖:http://download.csdn.net/detail/cp1300/7496509

        下面是STM8程序

        CC1101.C

        1. /*************************************************************************************************************
        2. *文件名:CC1101.c
        3. *功能:STM8CC1101驅動函數
        4. *作者:cp1300@139.com
        5. *創建時間:2013-12-0614:35
        6. *最后修改時間:2013-12-06
        7. *詳細:433MHZ收發芯片驅動
        8. *************************************************************************************************************/
        9. #include"system.h"
        10. #include"delay.h"
        11. #include"CC1101.h"
        12. //CC1101命令掩碼
        13. #defineWRITE_BURST0x40//連續寫入
        14. #defineREAD_SINGLE0x80//讀
        15. #defineWRITE_SINGLE0x00//寫
        16. #defineREAD_BURST0xC0
        17. //連續讀
        18. #defineBURST_READ_FIFO0xff//突發讀取RXFIFO
        19. #defineBYTE_READ_FIFO0xBF//單字節讀取RXFIFO
        20. #defineBURST_WRITE_FIFO0x7f//突發寫TXFIFO
        21. #defineBYTE_WRITE_FIFO0x3f//單字節寫TXFIFO
        22. #defineCC1101_DATA_LEN64
        23. //SPI接口
        24. //底層接口宏定義
        25. #defineCC1101_CS_H()(GPIOA->ODR=BIT3)//PA3=1
        26. #defineCC1101_CS_L()(GPIOA->ODR&=~BIT3)//PA3=0
        27. #defineCC1101_MOSI_H()(GPIOC->ODR=BIT6)//PC6
        28. #defineCC1101_MOSI_L()(GPIOC->ODR&=~BIT6)//PC6
        29. #defineCC1101_SCLK_H()(GPIOC->ODR=BIT5)//PC5
        30. #defineCC1101_SCLK_L()(GPIOC->ODR&=~BIT5)//PC5
        31. #defineCC1101_GetMISO()(GPIOC->IDR&BIT7)//PC7
        32. //CC1101SPI讀寫一字節
        33. //不帶片選
        34. u8CC1101_ReadWriteByte(u8data)
        35. {
        36. u8i;
        37. u8temp=0;
        38. for(i=0;i<8;i++)
        39. {
        40. if(data&0x80)
        41. {
        42. CC1101_MOSI_H();
        43. }
        44. else
        45. {
        46. CC1101_MOSI_L();
        47. }
        48. data<<=1;nop;
        49. CC1101_SCLK_H();//時鐘上升沿寫入數據
        50. temp<<=1;nop;
        51. if(CC1101_GetMISO())temp++;
        52. CC1101_SCLK_L();//時鐘下降沿讀取數據
        53. }
        54. returntemp;
        55. }
        56. /*************************************************************************************************************************
        57. *函數:u8CC1101_Command(CC1101_CMD_TYPECmd)
        58. *功能:發送單字節命令
        59. *參數:Cmd;命令,見CC1101_CMD_TYPE
        60. *返回:寄存器的值
        61. *依賴:底層宏定義
        62. *作者:cp1300@139.com
        63. *時間:2013-12-06
        64. *最后修改時間:2013-12-06
        65. *說明:以寫的方式單直接訪問將觸發響應的命令
        66. *************************************************************************************************************************/
        67. u8CC1101_Command(CC1101_CMD_TYPECmd)
        68. {
        69. u8status;
        70. CC1101_CS_L();//片選有效
        71. while(CC1101_GetMISO());
        72. status=CC1101_ReadWriteByte((u8)Cmd);//發送命令
        73. while(CC1101_GetMISO());
        74. CC1101_CS_H();//片選關閉
        75. returnstatus;
        76. }
        77. /*************************************************************************************************************************
        78. *函數:u8CC1101_ReadReg(CC1101_REG_TYPERegAddr)
        79. *功能:讀取CC1101通用寄存器
        80. *參數:RegAddr:寄存器地址,見:CC1101_REG_TYPE
        81. *返回:寄存器的值
        82. *依賴:底層宏定義
        83. *作者:cp1300@139.com
        84. *時間:2013-12-06
        85. *最后修改時間:2013-12-06
        86. *說明:一次讀取一個寄存器
        87. *************************************************************************************************************************/
        88. u8CC1101_ReadReg(CC1101_REG_TYPERegAddr)
        89. {
        90. u8data;
        91. CC1101_CS_L();//片選有效
        92. CC1101_ReadWriteByte((u8)READ_SINGLERegAddr);//發送讀命令以及寄存器索引
        93. data=CC1101_ReadWriteByte(0xff);//讀取
        94. CC1101_CS_H();//片選關閉
        95. returndata;
        96. }
        97. /*************************************************************************************************************************
        98. *函數:u8CC1101_WriteReg(CC1101_REG_TYPERegAddr,u8data)
        99. *功能:寫入CC1101通用寄存器
        100. *參數:RegAddr:寄存器地址,見:CC1101_REG_TYPE,data:需要寫入的數據
        101. *返回:狀態寄存器的值
        102. *依賴:底層宏定義
        103. *作者:cp1300@139.com
        104. *時間:2013-12-06
        105. *最后修改時間:2013-12-06
        106. *說明:一次寫入一個寄存器,并返回狀態
        107. 不要對只讀的寄存器進行寫操作
        108. *************************************************************************************************************************/
        109. u8CC1101_WriteReg(CC1101_REG_TYPERegAddr,u8data)
        110. {
        111. u8status;
        112. if(RegAddr>0x80)return0;//防止誤操作,0x30以后的寄存器為只讀狀態寄存器
        113. CC1101_CS_L();//片選有效
        114. while(CC1101_GetMISO());
        115. status=CC1101_ReadWriteByte((u8)WRITE_SINGLERegAddr);//發送寫命令以及寄存器索引
        116. CC1101_ReadWriteByte(data);//寫入數據
        117. CC1101_CS_H();//片選關閉
        118. returnstatus;
        119. }
        120. #include"LED.h"
        121. voidCC1101_Init(u8Addr)
        122. {
        123. //初始化片選
        124. GPIOx_Init(GPIOA,BIT3,OUT_PP_10M);
        125. CC1101_CS_H();
        126. //初始化SCLK
        127. GPIOx_Init(GPIOC,BIT5,OUT_PP_10M);
        128. CC1101_SCLK_H();
        129. //初始化MOSI
        130. GPIOx_Init(GPIOC,BIT6,OUT_PP_10M);
        131. CC1101_MOSI_H();
        132. //初始化MISO
        133. GPIOx_Init(GPIOC,BIT7,IN_UP);
        134. CC1101_SCLK_L();
        135. CC1101_MOSI_L();
        136. //初始化GDO0,GDO2對應PC3,PC4
        137. GPIOx_Init(GPIOC,BIT3,IN_UP);
        138. GPIOx_Init(GPIOC,BIT4,IN_UP);
        139. //初始化寄存器
        140. CC1101_Command(CC1101_CMD_SRES);//復位
        141. Delay_MS(10);
        142. while(CC1101_ReadReg(CC1101_REG_AGCTEST)!=0x3F)//檢測通信
        143. {
        144. LED_ON();
        145. Delay_MS(10);
        146. LED_OFF();
        147. Delay_MS(100);
        148. }
        149. LED_OFF();
        150. CC1101_WriteReg(CC1101_REG_IOCFG0,0x06);//發送提示引腳
        151. CC1101_WriteReg(CC1101_REG_IOCFG2,0x01);//接收提示引腳
        152. CC1101_WriteReg(CC1101_REG_FIFOTHR,0x0f);//RXFIFO和TXFIFO門限
        153. CC1101_WriteReg(CC1101_REG_SYNC1,0xD3);//同步詞匯,高字節
        154. CC1101_WriteReg(CC1101_REG_SYNC0,0x91);//同步詞匯,低字節
        155. CC1101_WriteReg(CC1101_REG_PKTLEN,CC1101_DATA_LEN);//數據包長度,255
        156. CC1101_WriteReg(CC1101_REG_PKTCTRL1,0x04);//數據包自動控制
        157. CC1101_WriteReg(CC1101_REG_PKTCTRL0,0x04);//數據包自動控制
        158. CC1101_WriteReg(CC1101_REG_ADDR,0x00);//設備地址
        159. CC1101_WriteReg(CC1101_REG_CHANNR,0x00);//信道
        160. CC1101_WriteReg(CC1101_REG_FSCTRL1,0x06);//頻率合成器控制,高字節
        161. CC1101_WriteReg(CC1101_REG_FSCTRL0,0x00);//頻率合成器控制,低字節
        162. CC1101_WriteReg(CC1101_REG_FREQ2,0x10);//頻率控制詞匯,高字節
        163. CC1101_WriteReg(CC1101_REG_FREQ1,0xb1);//頻率控制詞匯,中間字節
        164. CC1101_WriteReg(CC1101_REG_FREQ0,0x3b);//頻率控制詞匯,低字節
        165. //2.4KBPS
        166. CC1101_WriteReg(CC1101_REG_MDMCFG4,0xF6);//調制器配置
        167. CC1101_WriteReg(CC1101_REG_MDMCFG3,0x83);//調制器配置
        168. CC1101_WriteReg(CC1101_REG_MDMCFG2,0x13);//調制器配置
        169. CC1101_WriteReg(CC1101_REG_MDMCFG1,0x22);//調制器配置
        170. CC1101_WriteReg(CC1101_REG_MDMCFG0,0xf8);//調制器配置
        171. CC1101_WriteReg(CC1101_REG_DEVIATN,0x15);//調制器背離設置
        172. CC1101_WriteReg(CC1101_REG_MCSM2,0x07);//主通信控制狀態機配置
        173. CC1101_WriteReg(CC1101_REG_MCSM1,0x30);//主通信控制狀態機配置
        174. CC1101_WriteReg(CC1101_REG_MCSM0,0x18);//主通信控制狀態機配置
        175. CC1101_WriteReg(CC1101_REG_FOCCFG,0x16);//頻率偏移補償配置
        176. CC1101_WriteReg(CC1101_REG_BSCFG,0x6c);//位同步配置
        177. CC1101_WriteReg(CC1101_REG_AGCTRL2,0x03);//AGC控制
        178. CC1101_WriteReg(CC1101_REG_AGCTRL1,0x40);//AGC控制
        179. CC1101_WriteReg(CC1101_REG_AGCTRL0,0x91);//AGC控制
        180. CC1101_WriteReg(CC1101_REG_WOREVT1,0x87);//高字節時間0暫停
        181. CC1101_WriteReg(CC1101_REG_WOREVT0,0x6b);//低字節時間0暫停
        182. CC1101_WriteReg(CC1101_REG_WORCTRL,0xfb);//電磁波激活控制
        183. CC1101_WriteReg(CC1101_REG_FREND1,0x56);//前末端RX配置
        184. CC1101_WriteReg(CC1101_REG_FREND0,0x10);//前末端TX配置
        185. CC1101_WriteReg(CC1101_REG_FSCAL3,0xe9);//頻率合成器校準
        186. CC1101_WriteReg(CC1101_REG_FSCAL2,0x2a);//頻率合成器校準
        187. CC1101_WriteReg(CC1101_REG_FSCAL1,0x00);//頻率合成器校準
        188. CC1101_WriteReg(CC1101_REG_FSCAL0,0x1f);//頻率合成器校準
        189. CC1101_WriteReg(CC1101_REG_RCCTRL1,0x41);//RC振蕩器配置
        190. CC1101_WriteReg(CC1101_REG_RCCTRL0,0x00);//RC振蕩器配置
        191. CC1101_WriteReg(CC1101_REG_FSTEST,0x59);//頻率合成器校準控制
        192. //10DB
        193. //CC1101_WriteReg(CC1101_REG_PATABLE0,0xc0);
        194. //CC1101_WriteReg(CC1101_REG_PATABLE1,0xc0);
        195. /*CC1101_WriteReg(CC1101_REG_PATABLE2,0xc0);
        196. CC1101_WriteReg(CC1101_REG_PATABLE3,0xc0);
        197. CC1101_WriteReg(CC1101_REG_PATABLE4,0xc0);
        198. CC1101_WriteReg(CC1101_REG_PATABLE5,0xc0);
        199. CC1101_WriteReg(CC1101_REG_PATABLE6,0xc0);
        200. CC1101_WriteReg(CC1101_REG_PATABLE7,0xc0);*/
        201. Delay_MS(10);
        202. }
        203. /*************************************************************************************************************************
        204. *函數:voidCC1101_WriteTxFIFO(u8*pBuff,u8len)
        205. *功能:寫入數據到發送緩沖區
        206. *參數:pBuff:需要寫入的數據緩沖區指針,len:需要寫入的數據長度
        207. *返回:無
        208. *依賴:底層宏定義
        209. *作者:cp1300@139.com
        210. *時間:2014-01-01
        211. *最后修改時間:2014-01-01
        212. *說明:寫入數據到發送FIFO
        213. *************************************************************************************************************************/
        214. voidCC1101_WriteTxFIFO(u8*pBuff,u8len)
        215. {
        216. u16i;
        217. CC1101_CS_L();
        218. CC1101_ReadWriteByte(BURST_WRITE_FIFO);
        219. for(i=0;i
        220. {
        221. CC1101_ReadWriteByte(pBuff[i]);
        222. }
        223. CC1101_CS_H();
        224. }
        225. /*************************************************************************************************************************
        226. *函數:voidCC1101_ReadRxFIFO(u8*pBuff,u8len)
        227. *功能:讀取接收緩沖區
        228. *參數:pBuff:需要讀取的數據緩沖區指針,len:需要讀取的數據長度
        229. *返回:無
        230. *依賴:底層宏定義
        231. *作者:cp1300@139.com
        232. *時間:2014-01-01
        233. *最后修改時間:2014-01-01
        234. *說明:從接收FIFO讀取數據
        235. *************************************************************************************************************************/
        236. voidCC1101_ReadRxFIFO(u8*pBuff,u8len)
        237. {
        238. u16i;
        239. CC1101_CS_L();
        240. CC1101_ReadWriteByte(BURST_READ_FIFO);
        241. for(i=0;i
        242. {
        243. pBuff[i]=CC1101_ReadWriteByte(0xff);
        244. }
        245. CC1101_CS_H();
        246. }
        247. //發送數據,將緩沖區數據全部發送出去
        248. //一次最多64B,因為受到FIFO限制
        249. voidCC1101_RfDataSend(u8*pBuff,u8len)
        250. {
        251. CC1101_Command(CC1101_CMD_SIDLE);//退出當前模式
        252. CC1101_Command(CC1101_CMD_SFTX);//清空發送緩沖區
        253. CC1101_WriteTxFIFO(pBuff,len);//寫入數據到發送緩沖區
        254. CC1101_Command(CC1101_CMD_STX);//開始發送數據
        255. while(!CC1101_GDO0);
        256. while(CC1101_GDO0);
        257. CC1101_Command(CC1101_CMD_SIDLE);//退出當前模式
        258. }
        259. //發送數據包
        260. //每次發送最多65B,第一字節為長度,數據多將會重復發送
        261. //可以發送任意大小
        262. //CC1101PackSize有效數據包大小,0-64,也就是CC1101單次發送數據大小-1
        263. voidCC1101_RfDataSendPack(u8*pBuff,u16len)
        264. {
        265. u16i,m,n,j;
        266. m=len/(CC1101_DATA_LEN-1);//整數數據幀數量
        267. n=len%(CC1101_DATA_LEN-1);//余數
        268. //發送整數包
        269. for(i=0;i
        270. {
        271. Delay_MS(1);
        272. CC1101_Command(CC1101_CMD_SIDLE);//退出當前模式
        273. CC1101_Command(CC1101_CMD_SFTX);//清空發送緩沖區
        274. CC1101_CS_L();
        275. CC1101_ReadWriteByte(BURST_WRITE_FIFO);
        276. CC1101_ReadWriteByte(CC1101_DATA_LEN-1);//先寫入包大小
        277. for(j=0;j<(CC1101_DATA_LEN-1);j++)
        278. {
        279. CC1101_ReadWriteByte(*pBuff++);//寫入數據到發送緩沖區
        280. }
        281. CC1101_CS_H();
        282. CC1101_Command(CC1101_CMD_STX);//開始發送數據
        283. while(!CC1101_GDO0);
        284. while(CC1101_GDO0);//等待發送完成
        285. }
        286. //發送余數包
        287. if(n!=0)
        288. {
        289. Delay_MS(1);
        290. CC1101_Command(CC1101_CMD_SIDLE);//退出當前模式
        291. CC1101_Command(CC1101_CMD_SFTX);//清空發送緩沖區
        292. CC1101_CS_L();
        293. CC1101_ReadWriteByte(BURST_WRITE_FIFO);
        294. CC1101_ReadWriteByte(n);//先寫入包大小
        295. for(j=0;j
        296. {
        297. CC1101_ReadWriteByte(*pBuff++);//寫入數據到發送緩沖區
        298. }
        299. CC1101_CS_H();
        300. CC1101_Command(CC1101_CMD_STX);//開始發送數據
        301. while(!CC1101_GDO0);
        302. while(CC1101_GDO0);//等待發送完成
        303. }
        304. CC1101_Command(CC1101_CMD_SIDLE);//退出當前模式
        305. }
        306. //讀取芯片狀態
        307. u8CC1101_GetStatus(void)
        308. {
        309. returnCC1101_WriteReg(CC1101_REG_TEST2,0x98);
        310. }

        CC1101.H

        1. /*************************************************************************************************************
        2. *文件名:CC1101.c
        3. *功能:STM8CC1101驅動函數
        4. *作者:cp1300@139.com
        5. *創建時間:2013-12-0614:35
        6. *最后修改時間:2013-12-06
        7. *詳細:433MHZ收發芯片驅動
        8. *************************************************************************************************************/
        9. #ifndef_CC1101_H_
        10. #define_CC1101_H_
        11. #include"system.h"
        12. //CC1101命令
        13. //以寫的方式單直接訪問將觸發響應的命令
        14. typedefenum
        15. {
        16. CC1101_CMD_SRES=0x30,//重啟
        17. CC1101_CMD_SFSTXON=0x31,//開啟和校準頻率合成器(若MCSM0.FSAUTOCAL=1)
        18. CC1101_CMD_SXOFF=0x32,//關閉晶體振蕩器
        19. CC1101_CMD_SCAL=0x33,//校準頻率合成器并關斷(開啟快速啟動)。在不設置手動校準模式(MCSM0.FS_AUTOCAL=0)的情況下,SCAL能從空閑模式濾波。
        20. CC1101_CMD_SRX=0x34,//啟用RX。若上一狀態為空閑且MCSM0.FS_AUTOCAL=1則首先運行校準。
        21. CC1101_CMD_STX=0x35,//空閑狀態:啟用TX。若MCSM0.FS_AUTOCAL=1首先運行校準。若在RX狀態且CCA啟用:若信道為空則進入TX
        22. CC1101_CMD_SIDLE=0x36,//離開RX/TX,關斷頻率合成器并離開電磁波激活模式若可用
        23. CC1101_CMD_SAFC=0x37,//運行22.1節列出的頻率合成器的AFC調節
        24. CC1101_CMD_SWOR=0x38,//運行27.5節描述的自動RX選舉序列(電磁波激活)
        25. CC1101_CMD_SPWD=0x39,//當CSn為高時進入功率降低模式。
        26. CC1101_CMD_SFRX=0x3a,//沖洗RXFIFO緩沖
        27. CC1101_CMD_SFTX=0x3b,//沖洗TXFIFO緩沖
        28. CC1101_CMD_SWORRST=0x3c,//重新設置真實時間時鐘
        29. CC1101_CMD_SNOP=0x3d,//無操作。可能用來為更簡單的軟件將濾波命令變為2字節。
        30. }CC1101_CMD_TYPE;
        31. //CC1101寄存器定義
        32. typedefenum
        33. {
        34. //可讀寫的寄存器
        35. CC1101_REG_IOCFG2=0x00,//GDO2輸出腳配置
        36. CC1101_REG_IOCFG1=0x01,//GDO1輸出腳配置
        37. CC1101_REG_IOCFG0=0x02,//GDO0輸出腳配置
        38. CC1101_REG_FIFOTHR=0x03,//RXFIFO和TXFIFO門限
        39. CC1101_REG_SYNC1=0x04,//同步詞匯,高字節
        40. CC1101_REG_SYNC0=0x05,//同步詞匯,低字節
        41. CC1101_REG_PKTLEN=0x06,//數據包長度
        42. CC1101_REG_PKTCTRL1=0x07,//數據包自動控制
        43. CC1101_REG_PKTCTRL0=0x08,//數據包自動控制
        44. CC1101_REG_ADDR=0x09,//設備地址
        45. CC1101_REG_CHANNR=0x0a,//信道數
        46. CC1101_REG_FSCTRL1=0x0b,//頻率合成器控制,高字節
        47. CC1101_REG_FSCTRL0=0x0c,//頻率合成器控制,低字節
        48. CC1101_REG_FREQ2=0x0d,//頻率控制詞匯,高字節
        49. CC1101_REG_FREQ1=0x0e,//頻率控制詞匯,中間字節
        50. CC1101_REG_FREQ0=0x0f,//頻率控制詞匯,低字節
        51. CC1101_REG_MDMCFG4=0x10,//調制器配置
        52. CC1101_REG_MDMCFG3=0x11,//調制器配置
        53. CC1101_REG_MDMCFG2=0x12,//調制器配置
        54. CC1101_REG_MDMCFG1=0x13,//調制器配置
        55. CC1101_REG_MDMCFG0=0x14,//調制器配置
        56. CC1101_REG_DEVIATN=0x15,//調制器背離設置
        57. CC1101_REG_MCSM2=0x16,//主通信控制狀態機配置
        58. CC1101_REG_MCSM1=0x17,//主通信控制狀態機配置
        59. CC1101_REG_MCSM0=0x18,//主通信控制狀態機配置
        60. CC1101_REG_FOCCFG=0x19,//頻率偏移補償配置
        61. CC1101_REG_BSCFG=0x1a,//位同步配置
        62. CC1101_REG_AGCTRL2=0x1b,//AGC控制
        63. CC1101_REG_AGCTRL1=0x1c,//AGC控制
        64. CC1101_REG_AGCTRL0=0x1d,//AGC控制
        65. CC1101_REG_WOREVT1=0x1e,//高字節時間0暫停
        66. CC1101_REG_WOREVT0=0x1f,//低字節時間0暫停
        67. CC1101_REG_WORCTRL=0x20,//電磁波激活控制
        68. CC1101_REG_FREND1=0x21,//前末端RX配置
        69. CC1101_REG_FREND0=0x22,//前末端TX配置
        70. CC1101_REG_FSCAL3=0x23,//頻率合成器校準
        71. CC1101_REG_FSCAL2=0x24,//頻率合成器校準
        72. CC1101_REG_FSCAL1=0x25,//頻率合成器校準
        73. CC1101_REG_FSCAL0=0x26,//頻率合成器校準
        74. CC1101_REG_RCCTRL1=0x27,//RC振蕩器配置
        75. CC1101_REG_RCCTRL0=0x28,//RC振蕩器配置
        76. CC1101_REG_FSTEST=0x29,//頻率合成器校準控制
        77. CC1101_REG_PTEST=0x2a,//產品測試
        78. CC1101_REG_AGCTEST=0x2b,//AGC測試
        79. CC1101_REG_TEST2=0x2c,//不同的測試設置
        80. CC1101_REG_TEST1=0x2d,//不同的測試設置
        81. CC1101_REG_TEST0=0x2e,//不同的測試設置
        82. //只讀的狀態寄存器,如果寫入將導致命令濾波
        83. CC1101_REG_PARTNUM=0xf0,//CC2550的組成部分數目
        84. CC1101_REG_VERSION=0xf1,//當前版本數
        85. CC1101_REG_FREQEST=0xf2,//頻率偏移估計
        86. CC1101_REG_LQI=0xf3,//連接質量的解調器估計
        87. CC1101_REG_RSSI=0xf4,//接收信號強度指示
        88. CC1101_REG_MARCSTATE=0xf5,//控制狀態機狀態
        89. CC1101_REG_WORTIME1=0xf6,//WOR計時器高字節
        90. CC1101_REG_WORTIME0=0xf7,//WOR計時器低字節
        91. CC1101_REG_PKTSTATUS=0xf8,//當前GDOx狀態和數據包狀態
        92. CC1101_REG_VCOVCDAC=0xf9,//PLL校準模塊的當前設定
        93. CC1101_REG_TXBYTES=0xfA,//TXFIFO中的下溢和比特數
        94. CC1101_REG_RXBYTES=0xfB,//RXFIFO中的下溢和比特數
        95. //手冊上面沒有的
        96. CC1101_REG_STATUS1=0xfc,//
        97. CC1101_REG_STATUS0=0xfd,//
        98. //功率控制
        99. CC1101_REG_PATABLE0=0x40,
        100. CC1101_REG_PATABLE1=0x41,
        101. CC1101_REG_PATABLE2=0x42,
        102. CC1101_REG_PATABLE3=0x43,
        103. CC1101_REG_PATABLE4=0x44,
        104. CC1101_REG_PATABLE5=0x45,
        105. CC1101_REG_PATABLE6=0x46,
        106. CC1101_REG_PATABLE7=0x47,
        107. }CC1101_REG_TYPE;
        108. //IO
        109. #defineCC1101_GDO0(GPIOC->IDR&BIT3)//PC3
        110. #defineCC1101_GDO2(GPIOC->IDR&BIT4)//PC4
        111. voidCC1101_Init(u8Addr);//初始化CC1101
        112. u8CC1101_ReadReg(CC1101_REG_TYPERegAddr);//讀取CC1101通用寄存器
        113. u8CC1101_WriteReg(CC1101_REG_TYPERegAddr,u8data);//寫入CC1101通用寄存器
        114. u8CC1101_Command(CC1101_CMD_TYPECmd);//發送單字節命令
        115. u8CC1101_GetStatus(void);//讀取芯片狀態
        116. voidCC1101_RfDataSend(u8*pBuff,u8len);
        117. voidCC1101_ReadRxFIFO(u8*pBuff,u8len);
        118. //CC1101PackSize有效數據包大小,0-64,也就是CC1101單次發送數據大小-1
        119. voidCC1101_RfDataSendPack(u8*pBuff,u16len);
        120. #endif//CC1101

        MAIN.C收發透傳

        1. #include"system.h"
        2. #include"uart1.h"
        3. #include"delay.h"
        4. #include"main.h"
        5. #include"LED.h"
        6. #include"cc1101.h"
        7. //串口緩沖區
        8. #defineUART_BUFF_SIZE256//串口接收緩沖區大小
        9. u8UartBuff[2][UART_BUFF_SIZE];//串口接收緩沖區
        10. u16UartLen1=0;//串口接收數據長度
        11. u16UartLen2=0;//串口接收數據長度
        12. //CC1101緩沖區
        13. #defineRF_BUFF_SIZE64//CC1101緩沖區大小
        14. u8RfBuff[RF_BUFF_SIZE];//CC1101緩沖區
        15. u8RfLen=0;//CC1101接收緩沖區大小
        16. //緩沖區選擇
        17. u8UART_RxNum=0;//串口緩沖區選擇
        18. //主函數
        19. voidmain(void)
        20. {
        21. u8LastNum=0;
        22. u32delay=0;
        23. SYS_ClockInit();//初始化系統時鐘為內部晶振,16MHZ
        24. //初始化LED
        25. LED_Init();
        26. //初始化串口
        27. UART1_Init(115200,ENABLE);//初始化UART1,開啟接收中斷
        28. UART1_SetRxBuff(UartBuff[UART_RxNum],UART_BUFF_SIZE);//設置串口1接收緩沖區
        29. CC1101_Init(0Xaa);
        30. //CC1101_WriteReg(CC1101_REG_PATABLE1,0xc0);
        31. CC1101_WriteReg(CC1101_REG_PATABLE0,0x00);
        32. CC1101_Command(CC1101_CMD_SIDLE);//退出當前模式
        33. CC1101_Command(CC1101_CMD_SRX);//進入接收模式
        34. SYS_EnableInterrupt();//開啟系統中斷
        35. while(1)
        36. {
        37. if(++delay==120)
        38. {
        39. delay=0;
        40. UartLen1=UART1_GetRxCnt();//獲取接收數據數量
        41. if(UartLen1>0)
        42. {
        43. SYS_DisableInterrupt();//關閉中斷
        44. LED_ON();
        45. LastNum=UART_RxNum;//記錄上一次的緩沖區編號
        46. UART_RxNum=(~UART_RxNum)&0x01;
        47. UART1_SetRxBuff(UartBuff[UART_RxNum],UART_BUFF_SIZE);//切換串口接收緩沖區
        48. //UART1_ClearRxCnt();//清除接收計數器
        49. SYS_EnableInterrupt();//開啟系統中斷
        50. CC1101_WriteReg(CC1101_REG_PATABLE0,0xc0);//開啟天線增益
        51. CC1101_RfDataSendPack(UartBuff[LastNum],UartLen1);//CC1101發送數據包
        52. CC1101_WriteReg(CC1101_REG_PATABLE0,0);//關閉天線增益
        53. CC1101_Command(CC1101_CMD_SIDLE);//退出當前模式
        54. CC1101_Command(CC1101_CMD_SRX);//進入接收模式
        55. LED_OFF();
        56. }
        57. }
        58. //CC1101接收到數據
        59. if(CC1101_GDO2)
        60. {
        61. LED_ON();
        62. RfLen=CC1101_ReadReg(CC1101_REG_RXBYTES);
        63. CC1101_ReadRxFIFO(RfBuff,RfLen);
        64. UART1_SendData(&RfBuff[1],RfBuff[0]);//第0B為數據長度,后面的為有效數據
        65. CC1101_Command(CC1101_CMD_SIDLE);//退出當前模式
        66. CC1101_Command(CC1101_CMD_SFRX);//清除接收緩沖區
        67. CC1101_Command(CC1101_CMD_SRX);//進入接收模式
        68. LED_OFF();
        69. }
        70. }
        71. }

        實現透傳,調試中發現問題就是接收的時候必須關閉發射增益,否則無法接收,應該是內部發送接收天線進行了切換.

        實物圖



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 中阳县| 盖州市| 呼图壁县| 新宁县| 新巴尔虎右旗| 通山县| 禄丰县| 凤台县| 蒲城县| 盘锦市| 兴义市| 黔东| 满城县| 龙游县| 隆回县| 镇平县| 常德市| 肥城市| 南昌县| 安阳县| 昆山市| 广西| 淳化县| 肥城市| 青阳县| 收藏| 民丰县| 南丰县| 方山县| 德令哈市| 吉木乃县| 广东省| 唐海县| 桃源县| 图片| 新巴尔虎右旗| 车险| 阳曲县| 台前县| 肇庆市| 陆良县|