Сначала TL; DR: приемник UART1 не принимает; пожалуйста, скажите мне, что я делаю неправильно.
Более подробная версия:
В настоящее время я работаю над проектом, который использует UART для отправки отчетов о состоянии между двумя чипами PIC18f46k42. Предыдущие тесты на плате-прототипе с чипом f8722 работали нормально, но после перехода на f46k42 мне удалось заставить работать только передатчик; приемный буфер вообще не заполняется.
Я проверил и перепроверил настройку, описанную в документации (на странице 480 таблицы есть базовый контрольный список), поэтому я пришел к выводу, что это либо простая ошибка, на которую я не обращаю внимания, либо есть какая-то другая настройка, которую я пренебрегли.
Некоторые детали и вещи, которые я проверил во время отладки:
Я использую mpasm для программирования, MPLABX и PICKIT3.
U1RXB ничем не заливает, даже мусорными данными
- Все регистры управления настроены так, как я хотел их установить; вероятно, не пропуская БАНКСЕЛ
- Пины установлены как цифровые, контакт приема установлен как вход
- Проверен передатчик на прицеле; сигнал, как и ожидалось
- Дважды проверенная полярность данных верна
- Явно установил все управляющие регистры, которые я мог бы придумать, на всякий случай
Вот некоторый тестовый код с использованием одного чипа (хотел убедиться, что мой другой чип не плохой / осциллятор значительно отличается) и без всех наворотов, чтобы сосредоточиться на проблеме UART. Это не очень красиво (содержит ненужные артефакты от других тестов), так что заранее извиняюсь. Этот код никогда не достигает подпрограммы приема, в буфере приема никогда ничего нет (0x00, должно быть 0x87), приемный FIFO никогда не переполняется. Интересно, что при запуске этого теста бит RXIDL сброшен, хотя на самом деле он никогда ничего не получает.
;UART TEST
#include <p18F46k42.inc>
CONFIG WDTE = OFF
CONFIG LVP = OFF
CONFIG FEXTOSC = HS ; External Oscillator Selection (HS (crystal oscillator) above 8 MHz; PFM set to high power)
CONFIG RSTOSC = HFINTOSC_1MHZ
PROCR EQU 0x02 ;Temp register for receiving
PROCT EQU 0x03 ;Temp register for transmitting
ORG 0x00
GOTO START
ORG 0x100
START:
BCF TRISD,0
BCF PORTD,0
BANKSEL ANSELC
BCF ANSELC,7
BCF ANSELC,6
BSF TRISC,7
BCF TRISC,6
UART1_INIT:
BANKSEL U1BRGL
MOVLW d'207' ;particularly slow baud rate for testing purposes
MOVWF U1BRGL
CLRF U1BRGH
BANKSEL U1CON0
MOVLW b'00110000' ;enable tx and rx for UART1; 8-bit, no parity
MOVWF U1CON0
MOVLW b'10000000' ;enable UART1 module
MOVWF U1CON1
MOVLW b'00000000' ;normal polarity (high idle)
MOVWF U1CON2
BANKSEL PIE0
MOVLW b'01001000';Turn on UART1, and Receive interrupts
MOVWF PIE3
BANKSEL INTCON0
BSF INTCON0,GIEH
BANKSEL U1RXPPS
MOVLW b'00010111' ;PORTC,7 for U1 receive pin
MOVWF U1RXPPS
BANKSEL RC6PPS
MOVLW b'00010011' ;PORTC,6 for U1 tx pin
MOVWF RC6PPS
MAIN:
MOVLW 0x87
MOVWF PROCT
CALL TRANSMT
M2:
BANKSEL PIR3
BTFSS PIR3,3 ;check for full receive buffer
BRA MAIN
CALL RECEIVE
BRA MAIN
TRANSMT:
BANKSEL U1FIFO
BTFSS U1FIFO,5 ;Check if transmit register is empty
BRA TRANSMT ;If not, wait until it is empty
MOVF PROCT,W
BANKSEL U1TXB
MOVWF U1TXB ;Send data
RETURN
RECEIVE:
BANKSEL PIR0
BCF PIR3,U1RXIF ;Clear interrupt flag
BANKSEL U1RXB
MOVF U1RXB,W
MOVWF PORTD
RETURN
END
Любая помощь приветствуется; эта проблема - единственное, что мешает моему прогрессу на данный момент, и единственное, с чем я не смог разобраться самостоятельно.