软件模拟uart

本文介绍了通过定时器实现UART通信的思路。首先利用定时器设定波特率对应的1位时间,然后通过外部中断检测起始信号,接收到起始信号后关闭中断并启用定时器进行数据接收。发送数据同样采用定时器进行。代码基于已测试的基础进行修改,但尚未实际测试。
摘要由CSDN通过智能技术生成
为了能让小资源的芯片用,这里没写全双工,采用的是半双工方式
只支持 8bit 数据 1bit 停止位模式,可支持MSB/LSB两种
io配置这一块没有仔细去分析,所以现在支持的是双线,到时候可以改成单线串口,
不支持多个io口,只支持一个io口用,后续会升级

水平有限,写的不好请多多包涵,如有更好的思路或者更优代码,请分享

下面是h文件

//0是双线 1是单线 
#define UART_LINE_MODE (0)
//单线
#if (1 == UART_LINE_MODE)
#define SET_TX_MODE()  IOSTA |= 0x01
#define SET_RX_MODE()  IOSTA &= ~0x01
#define IO_TXD_SET_HIGH()  PORTAbits.PA1 = 1
#define IO_TXD_SET_LOW()   PORTAbits.PA1 = 0
#define IO_RXD_READ() 		PORTAbits.PA1
#else
//双线
#define IO_TXD_CFG()  		IOSTA |= 0x01 
#define IO_RXD_CFG()  		IOSTA &= ~0x02;
#define IO_TXD_SET_HIGH()  PORTAbits.PA1 = 1
#define IO_TXD_SET_LOW()   PORTAbits.PA1 = 0
#define IO_RXD_READ() 		PORTAbits.PA2
#endif

#define ON_UART_TIMER()  PORTCbits.PC0 
#define OFF_UART_TIMER()   PORTCbits.PC0 
#define ON_UART_IO_INTE() PORTBbits.PB0
#define OFF_UART_IO_INTE()  PORTCbits.PC0 
/*
	为了能让小资源的芯片用,这里没写全双工,采用的是半双工方式
	只支持 8bit 数据 1bit 停止位模式,可支持MSB/LSB两种
	io配置这一块没有仔细去分析,所以现在支持的是双线,到时候可以改成单线串口,
	不支持多个io口,只支持一个io口用,后续会升级
*/
#define IIC_BUFF_SIZE 10
typedef struct {
   

	u8 flag_operate 	: 4; 
	u8 status			:4 ;
    u8 buff_len;
	u8 number;
	u8 buff[IIC_BUFF_SIZE];
}g_soft_uart_typedef;
typedef struct {
   
	u8 mode 	: 1; //LSB/MSB
	u8 bit_cnt	:4 ;
	u8 level;
	u8 temp;
}s_soft_uart_typedef;
enum{
   
	UART_NO_OPERAT = 0,
	UART_WRITE,
    UART_READ,
};

extern g_soft_uart_typedef g_soft_uart;

void soft_uart_init(void);
void soft_uart_send_buff(u8* buff,u8 len);
void 
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值