打印
[PIC®/AVR®/dsPIC®产品]

PIC18F45K80单片机串口调试总结

[复制链接]
1324|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
drer|  楼主 | 2019-7-26 12:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天调试了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;                     //开启串口中断

}


使用特权

评论回复
沙发
drer|  楼主 | 2019-7-26 12:49 | 只看该作者
这时出现数据的错误我就在想原因,第一个想到的是波特率配置问题,尝试了很多次还是出现相同的问题,第二个我想到的是系统时钟问题比如时钟偏差,时钟分频没有设置对,也试了很多但都没有找到问题。在网上找到的资料跟我上面所配置的差不多。所以一时迷茫了。就拿来示波器,抓了下波形,发现了空闲时的电平问题,后来我又翻开数据手册。果然发现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 来抓取周期,从而计算出波特率。


使用特权

评论回复
板凳
15201018986| | 2019-7-26 13:35 | 只看该作者
MCC了解一下

使用特权

评论回复
地板
玛尼玛尼哄| | 2019-7-28 21:00 | 只看该作者
主要是PIC不提供例子。

使用特权

评论回复
5
玛尼玛尼哄| | 2019-7-28 21:01 | 只看该作者
其他厂家的芯片,都提供了丰富的例程,每个外设的每种用法都会演示,PIC找不到这些资源。

使用特权

评论回复
6
天灵灵地灵灵| | 2019-7-28 23:11 | 只看该作者
都是寄存器操作的,看着难懂。

使用特权

评论回复
7
天灵灵地灵灵| | 2019-7-28 23:11 | 只看该作者
PIC的没用库函数提供吗

使用特权

评论回复
评论
cdyyabc 2019-7-29 14:08 回复TA
提供例程的年代已经过去了,请紧跟时代的步伐,试试MCC 
8
奔波儿熊| | 2019-7-30 14:23 | 只看该作者
确实可以用MCC,不过你这个确实奇怪,UART空闲时一般都是高电平啊

使用特权

评论回复
9
lcczg| | 2019-7-31 09:35 | 只看该作者
很好奇,楼主是说调试器接收发送电平和常规的极性是相反的吗?发个示波器的图上来看看。

使用特权

评论回复
10
lcczg| | 2019-7-31 09:35 | 只看该作者
很好奇,楼主是说调试器接收发送电平和常规的极性是相反的吗?发个示波器的图上来看看.

使用特权

评论回复
11
xinxianshi| | 2019-7-31 21:25 | 只看该作者
太赞了,没想到这么多的坑

使用特权

评论回复
12
ywzqdpj| | 2021-8-4 16:40 | 只看该作者
为什么我加上还是error呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

3309

帖子

4

粉丝