Конфигурация PIC I2C PPS - PullRequest
0 голосов
/ 29 марта 2019

Я буду общаться с некоторым устройством через SMBus. Я использую PIC18F26K83 и буду использовать контакты RB1 и RB2 в качестве контактов SCL и SDA. Мой вопрос о картографировании PPS. В таблице указано, что мне нужно установить оба этих вывода на вход и выход. Что касается выбора вывода PPS, то это просто, потому что «RxyPPS: PIN Rxy ВЫБОР ИСТОЧНИКА ВЫБОРА ИСТОЧНИКА ВЫХОДА» позволяет мне выбрать пин, порт и SDA / SCL. Однако регистр «xxxPPS: PERIPHERAL xxx INPUT SELECTION» позволяет мне выбрать только порт и пин-код. Для большей ясности приведу пример:

RB1PPS= 0b00001001; //RB1 input PPS

Эта строка позволяет мне выбрать только порт и пин-код. Это говорит, что RB1 - вход, который является всем. С другой стороны:

RB1PPS= 0b00100011; // RB1= I2C2 (SCL) output.

Эта строка позволяет мне выбрать порт, вывод, а также выход SCL. Это говорит, что RB1 - выход, но также и SCL.

На странице данных: 266 PPS. Входные данные регистра, есть некоторые значения регистра, которые мне нужно использовать, чтобы выбрать вход в качестве SDA или SCL. (Я добавил таблицу)

Итак, мой вопрос: мне нужно выбрать SDA или SCL для ввода так же, как я выбираю для вывода? Какой блок кода кажется более точным?

1)

RB1PPS= 0b00001001; //RB1 input PPS
RB2PPS= 0b00001010; //RB2 input PPS
RB1PPS= 0b00100011; // RB1= I2C2 (SCL) output.
RB2PPS= 0b00100100; //RB2= I2C(SDA) output.
I2C2SCLPPS = 0b00001001; // RB1 I2C2 Clock
I2C2SDAPPS= 0b00001010;  // RB2 I2C2 Data

или

2)

RB1PPS= 0b00001001; //RB1 input PPS
RB2PPS= 0b00001010; //RB2 input PPS
RB1PPS= 0b00100011; // RB1= I2C2 (SCL) output.
RB2PPS= 0b00100100; //RB2= I2C(SDA) output

Лист данных: Лист данных PIC18F26K83

1 Ответ

1 голос
/ 01 апреля 2019

ПОПРОБУЙТЕ

/* Unlock PPS */

PPSLOCK = 0x55;
PPSLOCK = 0xAA;
PPSLOCKbits.PPSLOCKED = 0x00;


/* Setting of PPS */

/* RB1 <-> SCL2 */
RB1PPSbits.RB1PPS = 0x24;
I2C2SCLPPS  = 0x09;  

/* RB1 <-> SDA2 */    
RB1PPSbits.RB1PPS = 0x23;
I2C2SDAPPS = 0x0A;

/* Lock PPS */

PPSLOCK = 0x55;
PPSLOCK = 0xAA;
PPSLOCKbits.PPSLOCKED = 0x01;
...