本人小白,写个博客是记录自己在硬件方面遇到的问题,和已经解决了的方法。如果觉得我写的白痴就一笑而过,如果你也遇到类似情况可以一起讨论一起成长。

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;
}
}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值