【问题标题】:PIC I2C clock from timer output来自定时器输出的 PIC I2C 时钟
【发布时间】:2019-04-02 05:29:04
【问题描述】:

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

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 后缩放输出 (0110)。但是,它不起作用......如果我直接设置 I2CxCLK HFINTOSC 那么它就起作用了。 (在所有情况下,MCU 时钟均为 8 MHz)。所以我的问题是:

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

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

  3. 为了获得 100 kHz 和 250 kHz I2C 时钟以及 8 mHz MCU 频率,我还有其他选择吗?

【问题讨论】:

    标签: pic i2c


    【解决方案1】:

    不应该是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。

    【讨论】:

      猜你喜欢
      • 2014-10-16
      • 2019-08-20
      • 1970-01-01
      • 1970-01-01
      • 2016-11-24
      • 2016-09-17
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      相关资源
      最近更新 更多