Я просматривал таблицу данных Microchip PIC16LF15344
для выбора периферийных выводов, либо я неправильно читаю, либо в документе обнаружены ошибки и несоответствия. Я хотел бы знать, использовал ли кто-либо еще это устройство и может ли подтвердить мою интерпретацию.
Я пытаюсь написать код для PIC16LF15344
, чтобы использовать интерфейс I2C
. Мне удалось написать I2C
код для PIC16LF1822
, который работает нормально, но я до сих пор не смог заставить его работать на PIC16LF15344
, и в листе данных есть некоторая запутанная документация, которая мне бы хотелось чтобы очиститься.
Вот ссылка на таблицу данных .
Описания pinout
для PIC16LF15344
показывают, что функция I2C SDA
может быть присвоена RC1
или RB6
. Аналогично, I2C SCL
может быть выделено для RC0
или RB4
. Но в Section 15.3 Bidirectional Pins
есть примечание:
Функции I2C SCLx
и SDAx
можно переназначить через PPS
. Однако только пинты RB1
, RB2
, RC3
и RC4
имеют специальные входные буферы I2C
и SMBus
(режим I2C
отключает INLVL
и устанавливает пороговые значения, специфичные для I2C
). Если функции SCLx
или SDAx
отображаются на какой-либо другой вывод (кроме RB1
, RB2
, RC3
или RC4
), входные буферы общего назначения TTL
или ST
( вместо этого будет использоваться конфигурация на основе INLVL
настройки регистра). Поэтому в большинстве приложений рекомендуется только сопоставить функции выводов SCLx
и SDAx
с выводами RB1
, RB2
, RC3
или RC4
.
Проблема заключается не только в том, что заметка конфликтует с описаниями в таблицах распределения контактов, она также ссылается на контакты RB1
и RB2
, которые нигде не отображаются в таблицах распределения контактов, т. Е. Они кажется, не существует для этого PIC
. Я вижу похожие ссылки на сноски на RB1
и RB2
, но они не документированы нигде в теле документа или в таблицах.
Конечно, это должна быть ошибка документации, но я не могу найти текущих ошибок в таблице PIC16LF15324/44
, чтобы исправить это. Я правильно читаю?
Я попытался настроить SCL
и SDA
с PPS
на контакты RC0
и RC1
, поскольку именно так они подключены к моему PCB
, но я не могу получить I2C
работает, используя, по сути, то же самое программное обеспечение, которое я использовал для PIC16LF1822
. PPS
по умолчанию для EUSART TX2
и RX2
: RC0
и RC1
. Означает ли это, что мне нужно использовать TX2CKPPS
и RX2DTPPS
для перемещения назначений EUSART
в другое место, прежде чем использовать SSP1CLKPPS
и SSP1DATPPS
для назначения SCL
и SDA
на RC0
и RC1
?
Я буду исследовать другие потенциальные проблемы с моим PCB
, но я хочу исправить это, прежде чем отправлять еще один PCB
для потрясающего. В любом случае мне нужно внести некоторые изменения, поэтому я мог бы просто подключить SCL
и SDA
к их PPS
значениям по умолчанию в следующей версии и повторить попытку.
Вот код инициализации:
OSCFRQbits.HFFRQ = 0b011; // Set internal HF oscillator frequency to 8 MHz
WPUA = 0b00111111; // Enable all weak pull-up resistors on port A
WPUB = 0b11110000; // Enable all weak pull-up resistors on port B
WPUC = 0b11111100; // Enable all weak pull-up resistors on port C except
// RC0 and RC1 to be used as I2C SCL and SDA
TRISA = 0b00110000; // Set RA4 and RA5 as inputs
ANSELA = 0b00110000; // Set RA4 and RA5 to analog
TRISB = 0b00110000; // Set RB6 and RB7 as inputs
ANSELB = 0b11000000; // Set RB6 and RB7 as analog
TRISC = 0b11111011; // Set RC0, RC1, RC3, RC4, RC5, RC6, and RC7 as inputs
ANSELC = 0b11111000; // Set RC3, RC4, RC5, RC6, and RC7 as analog
TX2CKPPS = 0b01100; // Use RB4 for TX2
RX2DTPPS = 0b01110; // Use RB6 for RX2
SSP1CLKPPS = 0b10000; // Use RC0 as SCL
SSP1DATPPS = 0b10001; // Use RC1 as SDA
SSP1CON1 = 0b00100110; // SSPEN enabled, WCOL no collision, SSPOV no overflow,
// CKP low hold, SSPM I2C slave 7-bit
SSP1CON2 = 0b00000000; // ACKSTAT received, RCEN disabled, RSEN disabled,
// ACKEN disabled, ACKDT acknowledge, SEN disabled,
// GCEN disabled, PEN disabled
SSP1CON3 = 0b00000000; // BOEN disabled, AHEN disabled, SBCDE disabled,
// SDAHT 100 ns hold, ACKTIM ackseq, DHEN disabled,
// PCIE disabled, SCIE disabled
SSP1STAT = 0x00;
SSP1BUF = 0x00;
SSP1MSK = 0xff;
SSP1ADD = I2C_SLAVE_ADDR << 1;
PIR3bits.SSP1IF = 0; // Clear the SSP Interrupt flag
PIE3bits.SSP1IE = 1; // Enable SSP Interrupts
INTCONbits.GIE = 1; // Enable global interrupts
INTCONbits.PEIE = 1; // Enable peripheral interrupts