有问题的芯片是PIC24FJ256GB210
它是100针TQFP外形规格
我们有一个带有两个微处理器的嵌入式系统。
这两个微处理器使用通用异步收发器进行通信,(根据我的说法)该通用异步收发器映射到PIC24上的通用异步收发器#3。
我将4个字节放入UART #3中,一切正常。第5个字节将不会进入。
我说的是FIFO备份。
我当地的硬件专家说,如果我关闭了流控制,那么无论发生什么,字节都会传出。
这是真的吗?我从来没听过这句话。我认为这是另一端的硬件信号;即读信号必须出现在另一端,FIFO缓冲区才会在这一端留出空间。
他对“关闭流量控制”的定义是不使用PPS (外围Pin Select)将RTS (Request to Send)或CTS (Clear to Send)管脚映射到线路板上相应的物理管脚。
那是我做的。结果:没有变化;FIFO缓冲区仍然被填满。在第四个字节进入后,"#UTXBF“位永远不会清除。
我有带物理引脚编号和标签的原理图。
我有源代码和MpLab,在寄存器级别显示可执行文件,就在汇编语言指令本身。
我映射UART #3的引脚与映射UART #2和UART #1的方式完全相同,另外两个都能完美地工作。
虽然数字不同,但指令序列是相同的。数字和引脚相匹配。
我正在进行第三次调试,观察每个寄存器中的每个位,并将它们与手册进行比较,以确保我在正确的特殊功能寄存器中的正确位位置具有正确的相应数字。
这来自MpLab的反汇编窗口,其中的操作码准确地显示了设置和清除了哪些位。
206CC1 mov.w #0x6cc,0x0002 Mov #Uart_3_Tx_PPS_Output_Register, W1 ;This is the register we want
21C002 mov.w #0x1c00,0x0004 Mov #Uart_3_Tx_Or_In_Bit_Pattern, W2 ;These are the bits we want on
2C0FF3 mov.w #0xc0ff,0x0006 Mov #Uart_3_Tx_And_Off_Bit_Pattern, W3 ;These are the bits we want off
780211 mov.w [0x0002],0x0008 Mov [W1], W4 ;The existing pattern
618204 and.w 0x0006,0x0008,0x0008 And W3, W4, W4 ;Turn existing bits off
710204 ior.w 0x0004,0x0008,0x0008 Ior W2, W4, W4 ;Turn Desired bits on
780884 mov.w 0x0008,[0x0002] Mov W4, [W1] ;And that's all there is to it执行后,RPOR6 (即Uart_3_Tx_PPS_Output_Register)包含0x1C06
这是从用于创建蒙版和图案的inc文件中提取的。(我尽量避免在具有实际指令的源文件中对数字进行硬编码。)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; ;;
;; Map UART # 3 Tx Pin ;;
;; ;;
;; Docs for this are: Manual DS39975A ;;
;; ;;
;; Find "TABLE 2: COMPLETE PIN FUNCTION DESCRIPTIONS FOR 100-PIN DEVICES" ;;
;; in Manual DS39975A, Page 8, where We find the secret PIC Pin Names for ;;
;; the actual physical pin numbers ;;
;; ;;
;; TABLE 10-4: SELECTABLE OUTPUT SOURCES (MAPS FUNCTION TO OUTPUT) ;;
;; Page 160, We find the output function numbers ;;
;; ;;
;; ;;
;; ;;
;; PIC Associated Output ;;
;; Circuit Physical PIN Control Actual Func. ;;
;; Function Pin NAME Reg Bits Number ;;
;; ------------ ------ ----- ------- ---- ----- ;;
;; ;;
;; UART #3, TX Pin 23 RP13 RPOR6 3F00 28 Output ;;
;; ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;我将这些知识与族数据表中的这些注释结合起来,创建了具有有意义名称的常量。
.Equiv Uart_3_Tx_PPS_Output_Register, RPOR6 ;Register 10-35, Page 177
.Equiv Uart_3_Tx_Reg_Control_Bits, 0x3F00 ;Look for "RP13R" in the big include file ;;;DEBUG DEBUG Date: 2013-02-05 Time: 20:47:02
.Equiv Uart_3_Tx_Output_Func_Number, 28 ;From Table 10-4, P. 160
.Equiv Uart_3_Tx_And_Off_Bit_Pattern, ~(Uart_3_Tx_Reg_Control_Bits)
.Equiv Uart_3_Tx_Or_In_Bit_Pattern, ( Uart_3_Tx_Output_Func_Number << RP13R0 )来自文件:"p24FJ256GB210.inc“(无引号)
;----- RPOR6 Bits -----------------------------------------------------
.equiv RP12R0, 0x0000
.equiv RP12R1, 0x0001
.equiv RP12R2, 0x0002
.equiv RP12R3, 0x0003
.equiv RP12R4, 0x0004
.equiv RP12R5, 0x0005
.equiv RP13R0, 0x0008 ;;; <<<<<----- RP13 is in the right place
.equiv RP13R1, 0x0009
.equiv RP13R2, 0x000A
.equiv RP13R3, 0x000B
.equiv RP13R4, 0x000C
.equiv RP13R5, 0x000D不管是否启用了RTS或CTS,不管是否启用了UART或UART,UART另一端的PIC显然永远看不到我放在这一端的第一个字节。
有没有人看到我把错误的比特放在了错误的地方?
此时此刻,我不能自信地回答这个问题: UART #3 TX功能是否正确连接到配置了100针TQFP的PIC24FJ256GB210上的物理引脚23?
非常感谢,如果你能找出这里发生了什么。
发布于 2013-02-20 10:43:05
我在这里找到了错误和问题的答案
查看特殊功能寄存器U3STA
查找位UTXEN
必须设置它。
如果不是,你将填充FIFO,并在第4个字节之后阻塞它。
UTXEN是第#10位。汇编程序和编译器可能会在下一个更高的编号字节中将其更改为#2。
发布于 2013-02-13 02:14:56
关于PIC24微控制器上的这种行为,MicroChip发布了一个勘误表。参考:http://ww1.microchip.com/downloads/en/DeviceDoc/80522c.pdf。
文件的第4页指出:
Module: UART (TX Buffer)
If the transmit buffer is filled sequentially with
four characters, the characters may not be
transmitted in the correct order.
Work around
Do not completely fill the buffer before transmit-
ting data; send three characters or less at a
time.开发人员建议使用TRMT标志来解决另一个问题,请参阅:http://www.microchip.com/forums/m622420-print.aspx
希望能有所帮助。
发布于 2013-02-13 03:28:50
我的本地硬件专家
说,如果我关闭流控制,那么无论发生什么,字节都会输出。
是的,这是事实。但这需要时间,串行端口非常慢。从fifo传输一个字节需要很长时间,在9600波特率下大约需要1毫秒。这就是为什么UART通常由中断处理程序从较大的缓冲区馈送的原因。
https://stackoverflow.com/questions/14823674
复制相似问题