关于调试一个I2C设备的问题

现象:最近在做一个含有oled屏幕的产品,屏幕使用i2c方式通信,但出现许多奇奇怪怪的问题,如stm32单片机上只能用开漏的方式亮屏,用推挽方式亮不了;在合宙单片机上只能用推挽,用开漏驱动不了。用推挽驱动起来的屏幕显示也是怪怪的,屏幕内容总是抖动。

#ifdef oled_ic_ch1115
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    GPIO_ResetBits(GPIOA, GPIO_Pin_1);
    delay_ms(500);
    GPIO_SetBits(GPIOA, GPIO_Pin_1);

    oled_n.bus=&oled_n_i2c;
    
    oled_n.addr=OLED_N_ADD<<1;
    oled_n.bus->RCC_APB2 = RCC_APB2Periph_GPIOB;
    oled_n.bus->SCL_Port = GPIOB;
    oled_n.bus->SCL_Pin  = GPIO_Pin_10;
    oled_n.bus->SCL_IO_Mode = GPIO_Mode_Out_OD;
    oled_n.bus->SDA_Port = GPIOB;
    oled_n.bus->SDA_Pin  = GPIO_Pin_1;
    oled_n.bus->SDA_OUT_Mode = GPIO_Mode_Out_OD;
    oled_n.bus->SDA_IN_Mode = GPIO_Mode_IN_FLOATING;
    oled_n.bus->Interval = 1;

#endif

驱动方式使用软件i2c


 

最后解决了问题,解决的方式有两种

第一种:在上面的软件i2c的代码中加入适当的延迟函数,因为我上拉电阻选用的是10k,上拉电阻越大,电平变化的越平缓,也可以说是越缓慢,即若没有延迟函数的话,虽然代码中有高低电平变化的函数,但对于驱动设备而言,并没有高低变化的感觉,所以加上适当的延迟函数即可,当然这可能会使刷屏变慢

第二种:既然是上拉电阻太大,那改小一点就行了,改为1k大小的上拉电阻即可

posted @ 2023-07-25 10:12  kingzhan  阅读(14)  评论(0编辑  收藏  举报