×
单片机 > 单片机程序设计 > 详情

PIC18F45K80单片机串口调试总结

发布时间:2021-06-15 发布时间:
|

/****PIC18F45K80单片机串口调试总结—Sandy*********Start of file***********/

文件名:PIC18F45K80单片机串口调试总结

/***************************瘟 鸡 工 作 室********************************/


PIC18F45K80单片机串口调试总结


今天调试了PIC18F45K80单片机的串口模块,本来以为很简单的,去花了比较长的时间去调试,接上串口,启动串口调试助手,使用以下的配置函数是可以使调试助手收到数据的,但是一直出现单片机发送的数据跟接收到的数据不一致。


void pic_uart_init(void)


{


UART1MD = 0; //使能寄存器


/*端口配置 RC6__TX RC7__RX*/


TRISC6 = 1; //RC6配置为输入,手册中明确说明


TRISC7 = 1; //RC7配置为输入,手册中明确说明


/*波特率配置*/


BAUDCON1bits.BRG16 = 0; //使用8位波特率模式


SPBRG1 = 103; //9600波特率


BAUDCON1bits.ABDEN = 0; //禁止波特率测量


/*接收与发送配置配置*/


TXSTA1 = 0x24; //发送配置


RCSTA1 = 0x90; //接收配置


/*中断配置*/


RC1IE=1; //开启串口中断


}


这时出现数据的错误我就在想原因,第一个想到的是波特率配置问题,尝试了很多次还是出现相同的问题,第二个我想到的是系统时钟问题比如时钟偏差,时钟分频没有设置对,也试了很多但都没有找到问题。在网上找到的资料跟我上面所配置的差不多。所以一时迷茫了。就拿来示波器,抓了下波形,发现了空闲时的电平问题,后来我又翻开数据手册。果然发现BAUDCON1寄存器中有以下两位,网上找了很多资料是没有提到的。


然后我就修改了一下我的配置函数:如下



void pic_uart_init(void)


{


UART1MD = 0; //使能寄存器


/*端口配置 RC6__TX RC7__RX*/


TRISC6 = 1; //RC6配置为输入,手册中明确说明


TRISC7 = 1; //RC7配置为输入,手册中明确说明


/*波特率配置*/


BAUDCON1bits.BRG16 = 0; //使用8位波特率模式


SPBRG1 = 103; //9600波特率


BAUDCON1bits.ABDEN = 0; //禁止波特率测量


//以下两句非常重要


BAUDCON1bits.TXCKP = 1; //空闲状态下保持低电平。


BAUDCON1bits.RXDTP = 1; //接收电平反向。


/*接收与发送配置配置*/


TXSTA1 = 0x24; //发送配置


RCSTA1 = 0x90; //接收配置


/*中断配置*/


RC1IE=1; //开启串口中断


}


加上红色的那两句语句后接收和发送都正常了。我是说针对我的串口调试器正常了,我觉得应该有两种串口调试器,我是说空闲时电平不同的两种,或高电平,或低电平。如果有调试时发现发送错误可以试试改变空闲时的电平。


在调试时如果我们要用示波器去看串口的波特率,我们可以发送0XAA 或0X55 来抓取周期,从而计算出波特率。


/***************我所理解的 XXX—Sandy**************End of file*************/


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机中断源的扩展方法