我将通过SMBus与某些设备进行通信。我使用PIC18F26K83,并将RB1和RB2引脚用作SCL和SDA引脚。我的问题是关于PPS映射的。在数据表中说我需要将这两个引脚都设置为输入和输出。作为PPS输出选择,它很简单,因为“ RxyPPS:PIN Rxy输出源选择寄存器”让我选择引脚,端口和SDA / SCL。但是,“ xxxPPS:外围XXX输入选择”寄存器仅允许我选择端口和引脚。 更清楚地说,让我举个例子:
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
答案 0 :(得分:1)
请尝试
/* 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;