#pic #i2c #smbus
#pic #i2c #smbus
Вопрос:
Я буду взаимодействовать с каким-либо устройством через SMBus. Я использую PIC18F26K83 и буду использовать выводы RB1 и RB2 в качестве выводов SCL и SDA. Мой вопрос касается сопоставления PPS. В техническом описании сказано, что мне нужно установить оба этих вывода как для ввода, так и для вывода. Что касается выбора вывода PPS, то это просто, потому что «RxyPPS: РЕГИСТР ВЫБОРА ИСТОЧНИКА ВЫВОДА PIN Rxy» позволяет мне выбрать вывод, порт и SDA / SCL. Однако регистр «xxxPPS: ВЫБОР ПЕРИФЕРИЙНОГО ввода xxx» позволяет мне выбирать только порт и PIN-код. Чтобы было более понятно, позвольте мне привести пример:
RB1PPS= 0b00001001; //RB1 input PPS
Эта строка позволяет мне только выбрать порт и PIN-код. В нем говорится, что 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:
ПОПРОБУЙТЕ ЭТО
/* Unlock PPS */
PPSLOCK = 0x55;
PPSLOCK = 0xAA;
PPSLOCKbits.PPSLOCKED = 0x00;
/* Setting of PPS */
/* RB1 <-> SCL2 */
RB1PPSbits.RB1PPS = 0x23;
I2C2SCLPPS = 0x09;
/* RB2 <-> SDA2 */
RB2PPSbits.RB2PPS = 0x24;
I2C2SDAPPS = 0x0A;
/* Lock PPS */
PPSLOCK = 0x55;
PPSLOCK = 0xAA;
PPSLOCKbits.PPSLOCKED = 0x01;