IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 【3】SPI驱动CMT2300A实现串口通信:数据接收和发送 -> 正文阅读

[嵌入式]【3】SPI驱动CMT2300A实现串口通信:数据接收和发送

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

?

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:35:52  更:2022-05-05 11:39:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:55:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码