完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
LPC824+CC1101 数据收发
CC1101的库函数是搭配stm8s给的,但是cc1101只是一个发送数据的模块,和谁搭配都不要紧。CC1101数据发送和接受的代码如下: if( TX_MODE_1 == g_TxMode ) { CC1101_Tx_Packet( (uint8_t *)g_Ashining, 8 , ADDRESS_CHECK ); //模式1发送固定字符,1S一包 drv_delay_ms( 1000 ); led_red_flashing( ); } else { //查询串口数据 i = drv_uart_rx_bytes( g_UartRxBuffer ); if( 0 != i ) { CC1101_Tx_Packet( g_UartRxBuffer, i , ADDRESS_CHECK ); led_red_flashing( ); } } } #else //************************************* 接收 **********************************************// while( 1 ) { CC1101_Clear_RxBuffer( ); CC1101_Set_Mode( RX_MODE );//此处有用标注为(1) i = CC1101_Rx_Packet( g_RF24L01RxBuffer ); //接收字节 if( 0 != i ) { led_green_flashing( ); drv_uart_tx_bytes( g_RF24L01RxBuffer, i ); //输出接收到的字节 } } 把发送串口函数转移到LPV824的中断函数中,出现了卡死的状态,卡死的位置就在下面加粗的地方((2)处): void MRT_IRQHandler(void) { uint32_t int_pend; /* Get interrupt pending status for all timers / int_pend = Chip_MRT_GetIntPending(); Chip_MRT_ClearIntPending(int_pend); / Channel 0 and 1 are periodic, toggle on either interrupt */ if (int_pend & MRTn_INTFLAG(0)) { if( 0 != U0_Rxleng ) { CC1101_Set_Mode( TX_MODE );此处有用标注为(2) CC1101_Tx_Packet(U0_Rxbuffer, U0_Rxleng , ADDRESS_CHECK ); Chip_UART_SendBlocking(LPC_USART0, U0_Rxbuffer, U0_Rxleng); } //Chip_UART_SendBlocking(LPC_USART0, U0_Rxbuffer, U0_Rxleng); //TXFLAG =true; U0_Rxleng = 0; } 打断点线上调试时一直停在此处进不去,我一直以为是寄存器写入数据失败导致的((3)处是寄存器写入数据),然后在宏定义里将0X02改为0X46,结果就是程序可以通过去,但是不发送数据。(模式选择函数的函数体) void CC1101_Set_Mode( CC1101_ModeType Mode ) { if( Mode == TX_MODE ) //发送模式 { **CC1101_Write_Reg(CC1101_IOCFG0,0x46);**此处有用标注为(3) CC1101_Write_Cmd( CC1101_STX ); } else if( Mode == RX_MODE ) //接收模式 { CC1101_Write_Reg(CC1101_IOCFG0,0x46); CC1101_Write_Cmd( CC1101_SRX ); } while( 0 != CC1101_GET_GDO0_STATUS( )); //等待发送 或 接收开始 } 经过两个小时的摸索找到了原因,都是由于自己的先入为主的意识束缚住自己,在第一段发送和接收的代码里就是(1)部分是一个发送和接收模式切换的语句,导致我认为无论是发送还是接收都要先选择模式,其实在发送函数中就有对模式的选择,所以把写在发送函数前的模式选择语句删除即可。但是从逻辑上即使发送函数里对模式进行了选择,也并不会造成程序卡死和发送函数失败。这是我现在所不能理解的。(下面是发送函数的函数体) void CC1101_Tx_Packet( uint8_t *pTxBuff, uint8_t TxSize, CC1101_TxDataModeType DataMode )uint8_t Address; uint16_t l_RxWaitTimeout = 0; if( DataMode == BROADCAST ) { Address = 0; } else if( DataMode == ADDRESS_CHECK ) { Address = CC1101_Read_Reg( CC1101_ADDR ); } CC1101_Clear_TxBuffer( ); if(( CC1101_Read_Reg( CC1101_PKTCTRL1 ) & 0x03 ) != 0 ) { CC1101_Write_Reg( CC1101_TXFIFO, TxSize + 1 ); CC1101_Write_Reg( CC1101_TXFIFO, Address ); //写入长度和地址 由于多一个字节地址此时长度应该加1 } else { CC1101_Write_Reg( CC1101_TXFIFO, TxSize ); //只写长度 不带地址 } CC1101_Write_Multi_Reg( CC1101_TXFIFO, pTxBuff, TxSize ); //写入数据 CC1101_Set_Mode( TX_MODE ); //发送模式 while( 0 == CC1101_GET_GDO0_STATUS( )) //等待发送完成 { drv_delay_ms( 1 ); if( 1000 == l_RxWaitTimeout++ ) { l_RxWaitTimeout = 0; CC1101_Init( ); break; } } } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1617 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1543 浏览 1 评论
977 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1595 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
645浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
516浏览 3评论
532浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
505浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 11:21 , Processed in 0.861127 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号