来自定时器输出的 PIC I2C 时钟

PIC I2C clock from timer output

我需要使用 SMBus 与设备通信并在七段显示器上显示 SOC。我使用 PIC18F26K83。七段显示器需要 I2C 连接。问题是我将使用 2 个不同的 I2C 模块和 2 个不同的 I2C 时钟。 SMBus 需要在 10 kHz 和 100 kHz 之间。我使用 8 MHz MCU 时钟。对于七段显示部分,如果不将 I2CxCLK 寄存器设置为 HFINTOSC(0010),我将无法使其工作。我尝试使用 TMR2 post 缩放输出。定时器代码如下:

void InitTimer2(){

T2CLK =0b00000101; //500 kHz
T2CON.B7 = 1; //Timer 2 is on
T2CON.B3=0;
T2CON.B3=0;
T2CON.B3=0; //Timer 2 PostScaler = 1:2 (500/2 = 250 kHz)
T2CON.B3=1;
}

然后我在main方法中调用这个InitTimer2()函数。之后,我选择 I2CxCLK 作为 TMR2 post 缩放输出 (0110)。但是,它不起作用...如果我直接设置 I2CxCLK HFINTOSC 那么它就可以工作。 (在所有情况下,MCU 时钟均为 8 MHz)。所以我的问题是:

  1. 定时器初始化是否正确?

  2. 我的MCU频率会影响定时器频率吗?

  3. 我是否可以选择任何其他方式来获得 100 kHz 和 250 kHz I2C 时钟以及 8 mHz MCU 频率?

不应该是InitTimer2函数如下:

void InitTimer2(){

T2CLK =0b00000101; //500 kHz
T2CON.B7 = 1; //Timer 2 is on
T2CON.B3=0;
T2CON.B2=0;
T2CON.B1=0; 
T2CON.B0=1;  //Timer 2 PostScaler = 1:2 (500/2 = 250 kHz)
}

另外请检查PIC的PMD功能。请参阅数据表的 pg.275 和 pg.277。 确保 TMR2MD=0.