完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
官方例程没有发现串口异步双工通信的例程,这里分享下异步双工通信(模式1,10位数据发送)的例程。
基本上不算全双工工作方式,因为发送时要禁用串口0中断(set_ES),会同时禁用收和发,也就是发送到发送完成这段时间没有串口接收中断。 初始化uart0时,ti(串口0发送中断标志位)必须要set,因为printf内部实现靠TI判断上一个字符发送完成。 #include void usr_InitialUART0_Timer1_Mode1(UINT32 u32Baudrate) //T1M = 1, SMOD = 1 { P06_Quasi_Mode; //Setting UART pin as Quasi mode for transmit P07_Quasi_Mode; //Setting UART pin as Quasi mode for transmit SCON = 0x70; //UART0 Mode1, REN(Rx enable)=1, SM1(for mode1)=1, SM2(StopBit chk)=1 TMOD |= 0x20; //Timer1 Mode1 /* SMOD PCON.7 串口0波特率加倍使能. 串口0工作在模式2,或在模式1或3时,串口0用定时器1溢出作为波特率时钟源时,设置此位波特率加倍。 */ set_SMOD; //UART0 Double Rate Enable set_T1M; clr_BRCK; //Serial port 0 baud rate clock source = Timer1 #ifdef FOSC_160000 TH1 = 256 - (1000000/u32Baudrate+1); /*16 MHz */ #endif #ifdef FOSC_166000 TH1 = 256 - (1037500/u32Baudrate); /*16.6 MHz */ #endif set_TR1; // 定时器 1 启动控制 set_TI; //For printf function must setting TI = 1 } void UART0_SendData(char dat) { /* send data to uart by polling, will disable uart isr */ clr_ES; SBUF = dat; while(TI!=1); clr_TI; set_ES; } void UART0_SendString(char *s) { while(*s) { UART0_SendData(*s++); } } char putchar(char c) { UART0_SendData(c); return c; } void SerialPort0_ISR(void) interrupt 4 { if (RI) { /* stop bit */ /*if ((SCON & SET_BIT2) != SET_BIT2) { stat_rx_stop_bit_diff_cnt++; }*/ //uart_process_rx(); // 处理串口输入 clr_RI; } if (TI) { /* No frame error report */ //if (FE ) // FE = 0; clr_TI; } } /* main初始化代码: usr_InitialUART0_Timer1_Mode1(UART0_BAUD); set_ES; //For interrupt enable set_EA; */ 这个片子的UART最大通信速率能达多少? |
|
相关推荐
1个回答
|
|
根据N76E003的数据手册,UART通信速率最高可达到115200bps,在低速模式(SMOD=0)的情况下。
以下是该MCU异步双工通信(模式1,10位数据发送)的例程: ``` #include #include "N76E003.h" void usr_InitialUART0_Timer1_Mode1(UINT32 u32Baudrate) { P06_Quasi_Mode; P07_Quasi_Mode; SCON = 0x50; //UART0 Mode1,REN=1,TI=1 set_SMOD; T3CON &= 0xF8; //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1) T3CON |= 0x06; //UART0 baud rate clock source = Timer3 RH3 = HIBYTE(65536 - (SYS_CLOCK_FREQ/4/u32Baudrate)); RL3 = LOBYTE(65536 - (SYS_CLOCK_FREQ/4/u32Baudrate)); set_TR3; //Trigger Timer3 } void putchar(char c) { while (!TI); TI = 0; SBUF = c; } char getchar() { while (!RI); RI = 0; return SBUF; } void main() { usr_InitialUART0_Timer1_Mode1(9600); while (1) { putchar('H'); putchar('i'); putchar('n'); } } ``` 在该例程中,若要进行异步双工通信,则需要使用多个缓冲区和中断服务函数,因此该例程并没有完全实现全双工工作方式。 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2955 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 05:03 , Processed in 1.076261 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号