现象:最近在做一个含有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大小的上拉电阻即可
标签:Pin,bus,oled,InitStructure,Mode,GPIO,I2C,调试,设备 From: https://www.cnblogs.com/KingZhan/p/17579080.html