打印

请教香主,STM8S103 UART1校验位的问题?

[复制链接]
3983|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Xflyan|  楼主 | 2012-4-6 13:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Xflyan 于 2012-4-6 13:38 编辑

最近在STM8S103上调MODBUS RTU,MODBUS的Serial通信字符帧长度为11bit,即无校验(NONE) + STOP_BIT_2 或 奇校验(ODD) + STOP_BIT_1 或 偶校验(EVEN) + STOP_BIT_1;但一个奇怪的问题就是,只要103的字符帧长度为11bit,前面的3选1,PC端不管用哪种方式发送(ODD/EVEN/MARK/SPACE + 1),103居然都能够正确接收并返回,为此我还特意测了一下我PC端的发送序列,奇校验和偶校验时明显是不一样的,103这个情况似乎太强悍了:funk:,能解释下吗?为什么没有103没有提示校验错误?
UART1配置为 测试波特率为9600:
void halUARTInit(u8 baudrate, u8 parity)
{
        switch (parity) {
        case UART_PARITY_NONE:
                UART1->CR3 = 0x20; // STOP_BIT_2
                break;
               
        case UART_PARITY_EVEN:
                UART1->CR1 = UART1_CR1_PCEN | UART1_CR1_M;
                break;
               
        case UART_PARITY_ODD:
                UART1->CR1 = UART1_CR1_PCEN | UART1_CR1_PS | UART1_CR1_M;
                break;
               
        default:
                UART1->CR1 = UART1_CR1_PCEN | UART1_CR1_M;
                break;
        }
       
        switch (baudrate) {
        case UART_BR_115200:
                UART1->BRR2 = 0x0B; // 12MHz 115200:BRR=0x0068;
                UART1->BRR1 = 0x08; // 16MHz 115200:BRR=0x008B
                break;
               
        case UART_BR_57600:
                UART1->BRR2 = 0x06; // 12MHz 57600:BRR=0x00D0;
                UART1->BRR1 = 0x11; // 16MHz 57600:BRR=0x0116
                break;
               
        case UART_BR_38400:
                UART1->BRR2 = 0x01; // 12MHz 38400:BRR=0x0139;
                UART1->BRR1 = 0x1A; // 16MHz 38400:BRR=0x01A1
                break;
               
        case UART_BR_19200:
                UART1->BRR2 = 0x01; // 12MHz 19200:BRR=0x0271;
                UART1->BRR1 = 0x34; // 16MHz 19200:BRR=0x0341
                break;
               
        case UART_BR_9600:
                UART1->BRR2 = 0x03; // 12MHz 9600:BRR=0x04E2;
                UART1->BRR1 = 0x68; // 16MHz 9600:BRR=0x0683
                break;
        }
   
        UART1->CR2 |= UART1_CR2_TEN | UART1_CR2_REN;
    UART1->CR2 |= UART1_CR2_RIEN; // RX Interrupt Enable
}
沙发
香水城| | 2012-4-6 15:58 | 只看该作者
LZ是如何判断103没有提示校验错误的?

使用特权

评论回复
板凳
Xflyan|  楼主 | 2012-4-6 16:27 | 只看该作者
本帖最后由 Xflyan 于 2012-4-6 16:33 编辑

回香主,我是在DEBUG下看接收字符后的UART1->SR,里面的PE位为0
主要奇怪的是既然开启了校验位,在校验方式不一样的时候应该不能正常通信的,但是不管上位机用哪种校验方式,都能够与103正常通信,之前我没有细看DS,没有置位UART1_CR1_M的时候只能在无校验+2Stopbits下正常通信,其它情况下返回错误数据,后来注意到UART1_CR1_M跟传送的数据位有关,然后加上去了,结果就成这样了

使用特权

评论回复
地板
Xflyan|  楼主 | 2012-4-6 16:40 | 只看该作者
本帖最后由 Xflyan 于 2012-4-6 16:46 编辑

switch (parity) {
case UART_PARITY_NONE:
        UART1->CR3 = 0x20;
        break;
       
case UART_PARITY_EVEN:
        UART1->CR1 = UART1_CR1_PCEN;// | UART1_CR1_M;
        break;
       
case UART_PARITY_ODD:
        UART1->CR1 = UART1_CR1_PCEN | UART1_CR1_PS;// | UART1_CR1_M;
        break;
       
default:
        UART1->CR1 = UART1_CR1_PCEN;// | UART1_CR1_M;
        break;
}
103选择奇校验ODD,在不置位M位的时候,上位机发送下来的数据也正常接收,但是返回时出错了
发送命令为READ_HOLDING_REGS:01 03 00 00 00 01 84 0A
返回值为:01 83 02 92 34 B3 04
正常返回值应为:01 03 02 12 34 33 04

使用特权

评论回复
5
香水城| | 2012-4-6 16:50 | 只看该作者
你应该在程序中检查UART1->SR的PE位,在调试窗口看的时候,标志位很可能已经被其他事件清除了。

使用特权

评论回复
6
Xflyan|  楼主 | 2012-4-6 18:18 | 只看该作者
嗯,还是之前不够仔细,PE和OR事件发生了,但在被我读DR时清除掉了!!现在好了,读DR前先判断SR里面是否置位了PE,是则认为错误!在11bit的情况下传输,后两位是校验和停止位,如果不加帧错误判断,对数据部分的传输是无影响的!今天又学到了一点...

使用特权

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

本版积分规则

个人签名:业精于专!做精密仪器 做舒适测量!www.tesoo.cc

3

主题

305

帖子

2

粉丝