STM32
直播中

毛头大小子

12年用户 612经验值
私信 关注
[问答]

如何去实现LPC824+CC1101的数据收发呢

如何去实现LPC824+CC1101的数据收发呢?其代码程序该怎样去实现呢?

回帖(1)

冉屹芳

2021-12-20 15:08:17
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;
}
}
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分