UTXEN不会设置

时间:2013-02-18 17:35:20

标签: uart pic24

芯片是PIC24FJ256GB210

UART#3上的#UTXEN位不会置位。

使用完全相同的指令序列在UART#1上设置正常。 UART#2也是如此。

WORKS ...

 096E6  204000     mov.w #0x400,0x0000            111:           Mov     #Uart_1_Status_Control_Pattern, W0      ;Defined in CONSTANT.INC file
 096E8  881110     mov.w 0x0000,0x0222            112:           Mov     W0, U1STA                               ;ibid, page 230 Reg 17-2

失败...

09748  204000     mov.w #0x400,0x0000            248:           Mov.W   #Uart_3_Status_Control_Pattern, W0              ;Defined in CONSTANT.INC file
0974A  881290     mov.w 0x0000,0x0252            249:           Mov.W   W0, U3STA                                       ;ibid, page 230, Reg 17-2

所以我想,“啊,这是我想要的一个比特,并且在所有只读位之上移动的全字会以某种方式导致问题。我只会做一个单位设置”。

不,仍然不会设置那个位。

失败...

 09754  A84253     bset.b 0x0253,#2               256:      Bset.W  U3STA, #UTXEN                   ;DEBUG DEBUG DEBUG Date: 2013-02-18  Time: 11:37:07 

- UPDATE -

我可以在MpLab中设置该位。有什么区别?

我真的很困惑。还有什么可以防止这个位被设置?

2 个答案:

答案 0 :(得分:0)

错误

与UART状态寄存器一起,我正在使用的PIC24中的每个UART都有一个相应的UART模式寄存器。

在这种情况下,其名称为U3MODE

相应的模式寄存器中有一个“UART使能”位

在这种情况下,该位称为UARTEN,这是(根据我的特定PIC的文档)高位。

根据我用来组装它的文件p24FJ256GB210.inc,它们就像这样定义......

    .equiv UARTEN,  0x000F

如果U3MODE寄存器中的该位未在之前设置,则尝试将UTXEN位设置为相应的状态寄存器(在本例中为U3STA寄存器),那么状态寄存器不会以你想要的方式改变它的值。

修复

首先设置UARTEN寄存器中的U3MODE位,然后可以设置UTXEN寄存器中的U3STA位。

代码示例

我已从此处的反汇编窗口复制,以提供源,实际十六进制值以及每条指令的物理十六进制编码。

标签实际上只是我制作的标志;有用的代码,可以阅读的代码;那种想法。您可以在每条指令的反汇编部分中查看它们的值。

在这种情况下,最重要的是在尝试设置U3MODE寄存器中的位之前确保U3STA寄存器的高位。

这解决了这个问题。

                                                                             ;-------------------------------------
                                                                             ; --- THIS MUST COME FIRST ---
                                                                             ;
280080  mov.w #0x8008,0x0000  Mov.W   #Uart_3_Mode_Pattern, W0            ;Defined in Constant.Inc File
881280  mov.w 0x0000,0x0250   Mov.W   W0, U3MODE                          ;Documented in Manual DS39975A, p. 228, Register 17-1
                                                                             ;
                                                                             ; --- IN ORDER FOR THIS TO WORK ---
                                                                             ;
204000  mov.w #0x400,0x0000   Mov.W   #Uart_3_Status_Control_Pattern, W0  ;Defined in CONSTANT.INC file
881290  mov.w 0x0000,0x0252   Mov.W   W0, U3STA                           ;Manual DS39975A, page 230, Reg 17-2

答案 1 :(得分:0)

自己绊倒了(感谢帖子)并最终找到了:

Microchip的PIC24F系列参考手册,第21.4节UART配置,第21.4.1小节启用UART表示“在UARTEN位置1之前,不应设置UTXEN位,否则UART传输将不会被使能。”

http://ww1.microchip.com/downloads/en/DeviceDoc/39708B.pdf