/****PIC18F45K80单片机串口调试总结—Sandy*********Start of file***********/
文件名:PIC18F45K80单片机串口调试总结
作者:手术刀
QQ: 872180981
Time :2015-8-29
/***************************瘟 鸡 工 作 室********************************/
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; //开启串口中断
}
加上红 {MOD}的那两句语句后接收和发送都正常了。我是说针对我的串口调试器正常了,我觉得应该有两种串口调试器,我是说空闲时电平不同的两种,或高电平,或低电平。如果有调试时发现发送错误可以试试改变空闲时的电平。
在调试时如果我们要用示波器去看串口的波特率,我们可以发送0XAA 或0X55 来抓取周期,从而计算出波特率。
/***************我所理解的 XXX—Sandy**************End of file*************/