1、项目内容
使用MCU的SPI驱动CMT2300A,完成数据的发送和接收,实现串口通信。
MCU:? ? ? ? ?HC32F005,STM32的国产化替代产品;
CMT2300A: 无线射频收发器,包含完整的发射器、接收器和收发器,
? ? ? ? ? ? ? ? ? ? 支持64byteTX/RX FIFO等。
通信方式:(本项目半双工方式通信)
? ? ? ? ? ? ? ? ? ? ?单工模式:只能接收,不能发送;只能发送,不能接收;
? ? ? ? ? ? ? ? ? ? ?半双工模式:对讲机:A发送时,B接收;B发送时,A接收;
? ? ? ? ? ? ? ? ? ? ?全双工模式:打电话:可同时收发。
2、项目的整个逻辑
?MCU驱动SPI,与CMT2300的SPI相连,实现控制访问CMT2300的寄存器和FIFO,
MCU驱动CMT2300A,实现数据的发送和接收,两块板子:发送端和接收端
A设备:主机模式,发送数据?
A设备:主机模式发送数据
(1)u_rxBuffer 赋值给 g_txBuffer, 串口输入的数据由CM2300A发送出去;
(2)串口把数据发送出去:
????????????????Uart_SendDataPoll();
(3)CMT2300A发送数据:
????????????????Radio_Send_FixedLen(g_txBuffer,FIFO_DEPTH);
(4)判断是否接收标志,并进入接收状态
? ? ? ? ? ? ? ??if(Radio_Recv_FixedLen(g_rxBuffer,FIFO_DEPTH))
????????????????{
? ? ? ? ? ? ? ? ? ? ? ??//接收到的数让串口发送出去
????????????????????????memcpy(u_txBuffer,g_rxBuffer+2,FIFO_DEPTH-2);
????????????????}
????????????????CMT2300A_GoRx();
A设备:主机发送模式函数代码:
//设备A:主机模式
while (1)
{
if( (u_rxpkgflg == 1)&&(u_rxindex > 0))
{
//把串口收到的数据,赋值给g_txBuffer,让2300A发送出去
memcpy(g_txBuffer,u_rxBuffer,RF_PACKET_SIZE);
memset(u_rxBuffer,0,RF_PACKET_SIZE); //初始化串口数组
}
if(timer1ms >= 1000)
{
//主机模式:发送
if(MorS == MASTER)
{
for(i = 0; i < RF_PACKET_SIZE; i++)
{
//UART串口发送数据:u_txBuffer[i] 上位机输入的值???
Uart_SendDataPoll(M0P_UART1,u_txBuffer[i]);
}
if(IsExist_2300a)
{
//2300发送数据
Radio_Send_FixedLen(g_txBuffer,FIFO_DEPTH);
r_rf_frameindex = 0;
}
}
}
if(IsExist_2300a)
{
//是否开始接收数据
if(Radio_Recv_FixedLen(g_rxBuffer,FIFO_DEPTH))
{
g_nRfRxtimeoutCount = 0;
//把2300A_接收到的数据复制 到 串口_发送缓存区
memcpy(u_txBuffer+r_rf_frameindex*(FIFO_DEPTH-2),g_rxBuffer+2,FIFO_DEPTH-2);
}
if(r_rf_frameindex < (RF_PACKET_SIZE / FIFO_DEPTH))
r_rf_frameindex++;
}
//A设备进入接收状态
if(g_nRfRxtimeoutCount>RF_RX_TIMEOUT0)
{
CMT2300A_GoRx();
}
}
}
B设备:从机模式,接收数据
(1)u_rxBuffer 赋值给 g_txBuffer, 串口输入的数据由CM2300A发送出去;
(2)串口发送数据:
????????????????Uart_SendDataPoll()
(3)进入从机模式:
? ? ? ? //从机开始接收数据,接收完发送数据
????????if(Radio_Recv_FixedLen(g_rxBuffer,FIFO_DEPTH))
????????{
????????????????memcpy(u_txBuffer,g_rxBuffer+2,FIFO_DEPTH-2); //串口发送2300接收到的数据
????????????????Radio_Send_FixedLen(g_txBuffer,RF_PACKET_SIZE);//从机发送数据
????????}
? ? ? ? //进入接收状态
????????CMT2300A_GoRx();
while (1)
{
if( (u_rxpkgflg == 1)&&(u_rxindex > 0))
{
//u_rxBuffer:串口助手输入自己想要发送的数据
memcpy(g_txBuffer,u_rxBuffer,RF_PACKET_SIZE); //g_txBuffer <== u_rxBuffer
memset(u_rxBuffer,0,RF_PACKET_SIZE); //初始化串口_接收缓存区
}
if(MorS == SLAVE)
{
if( (timer1ms >= 500) && (sendflag == 0))
{
for(i = 0; i < FIFO_DEPTH; i++)
{
//串口发送数据
Uart_SendDataPoll(M0P_UART1,u_txBuffer[i]);
}
}
}
if(IsExist_2300a)
{
//判断数据接收完成,再发送数据
if(Radio_Recv_FixedLen(g_rxBuffer,FIFO_DEPTH))
{
g_nRfRxtimeoutCount = 0;
if(MorS == SLAVE)//从机模式:发送数据
{
timer1ms = 0;
sendflag = 0;
//把2300接收的数据,复制到串口发送
memcpy(u_txBuffer,g_rxBuffer+2,FIFO_DEPTH-2);
//发送数据
Radio_Send_FixedLen(g_txBuffer,RF_PACKET_SIZE);
}
}
//进入接收状态
if(g_nRfRxtimeoutCount>RF_RX_TIMEOUT0)
{
CMT2300A_GoRx();
}
}
}
?
|