1425|2

6841

帖子

11

TA的资源

版主

楼主
 

【平头哥RVB2601创意应用开发】模拟UART之二 [复制链接]

 

【平头哥RVB2601创意应用开发】模拟UART一 https://bbs.eeworld.com.cn/thread-1199753-1-1.html

继上篇,昨天调到晚上11点,早上6点起来,到现在,终于把接收写完了,调试一下还行。

接收相比发送要用到IO的中断,定时器的数据接,相对复杂多,我在调式中因为对串口启始位的判断认识不足,花了好些心思,这里把成功的函数附下:

//发送一个字符
void send_Char(uint8_t c)
{
	aos_msleep(1);
	io_uart0_tx_write_Low;//发送起始位 高拉低电
	io_uart_para.vm_uart_tx_byte = c;
	io_uart_para.vm_uart_tx_bit = 0;
	io_uart_para.vm_uart_dir = VM_SEND;
	io_uart0_rx_timer_enable();
	while(io_uart_para.vm_uart_dir == IDLE); 
}
//发送字串符
void send_str(uint8_t buf[],uint8_t len)
{
	uint8_t i;
	for(i<0; i<len; i++){
		send_Char(buf[i]);
	}
}

//定时器回调函数
void timer1_handler(void *arg)
{
	if(io_uart_para.vm_uart_dir == VM_SEND)//如果是发送
	{
		if(io_uart_para.vm_uart_tx_bit <=8 ) //如果发送不足8位
		{
			if((io_uart_para.vm_uart_tx_byte & 0x01) == 0x01 ){
				io_uart0_tx_write_High;
			}else{
				io_uart0_tx_write_Low;
			}
			io_uart_para.vm_uart_tx_byte>>=1;
		}
		else{
			if(io_uart_para.vm_uart_tx_bit > 8){
				io_uart0_tx_write_High;
				//io_uart0_rx_timer_disable();
				io_uart_para.vm_uart_tx_flag = 0; //设置为发送完毕
				io_uart_para.vm_uart_dir = IDLE;
				
			}
		}
		io_uart_para.vm_uart_tx_bit ++;
		
	}
	else if(io_uart_para.vm_uart_rx_irq == VM_REVC)
	{
		if(io_uart_para.vm_uart_rx_count == 0)//处理起始位
		{
			if(io_uart0_rx_ReadPin() == 0)//起始位为0时,清零接收缓冲器,准备接收数据位
			{
				io_uart_para.vm_uart_rx_count ++;
				io_uart_para.vm_uart_tx_byte = 0;
				//关闭接收IO中断
				io_uart0_rx_IO_disable();
			}
			else //起始位不为 0 时,中止接收
			{
				io_uart_para.vm_uart_rx_irq = IDLE;
				io_uart0_rx_IO_enable();
			}
		}
		else if(io_uart_para.vm_uart_rx_count <= 8)
		{
			io_uart_para.vm_uart_rx_byte>>=1;
			if(io_uart0_rx_ReadPin() == 1)
			{
				io_uart_para.vm_uart_rx_byte |= 0x80;
			}
			io_uart_para.vm_uart_rx_count ++;
		}
		else //停止位处理
		{
			io_uart0_rx_IO_enable();
			io_uart_para.vm_uart_rx_count = 0;
			io_uart_para.vm_uart_rx_irq = IDLE;
			io_uart_para.vm_uart_rx_buf[io_uart_para.vm_uart_rx_flag] = io_uart_para.vm_uart_rx_byte; 
			io_uart_para.vm_uart_rx_flag = io_uart_para.vm_uart_rx_flag +1;				
		}
		
	}
	
}


//io_uart0rx回调函数
static void io_uart0_rx_interrupt_handler(csi_gpio_pin_t *pin,void *arg)
{
    if(csi_gpio_pin_read(&io_uart0_rx)==GPIO_PIN_LOW)
    {
		io_uart_para.vm_uart_rx_irq = VM_REVC;//接收标志
		io_uart0_rx_IO_disable();
		//关掉接收中断
    }
    
}

效果如下:

实现效果还可以没有丢包乱码情况。但是这还是理想情况下的收发,不知道用到工程里会不会有什么BUG。欢迎大家指点一下。

附文件:

main.c (5.42 KB, 下载次数: 0)



 

最新回复

这个有点NB,得对硬件充分了解呀   详情 回复 发表于 2022-4-15 20:54
点赞(1) 关注
 
 

回复
举报

2万

帖子

74

TA的资源

管理员

沙发
 

辛苦:)

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 
 

回复

280

帖子

7

TA的资源

一粒金砂(高级)

板凳
 

这个有点NB,得对硬件充分了解呀

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表