关于调试一个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大小的上拉电阻即可