最近着手做一个项目,没有使用过OLED显示屏,学习了一下,相关心得分享出来,希望大家批评指正。谢谢。
先从i2c说起吧,STM32F10x片上是有硬件I2c资源的,可以通过配置相关寄存器实现I2c的通信,但是由于IO口资源比较紧张,我选择模拟I2c,通过程序模拟i2c的通信时序,另外上手模拟I2c会让大家对i2c的通信时序有更深入的了解
首先,i2c的物理层,如图:
SCL&SDA总线都要有上拉电阻,这是通信协议规定的,而且是必须的,这一点先不深究,参考值通常4.7K(欧姆),而我采用的中景园0.96寸4PINOLED内部自带上拉,可以直接使用
下面我们开始进行I2c通信协议的模拟:
由于OLED几乎不向主机发送数据,这里我只讨论数据写方向:起始信号+(设备地址+读写方向)发送的数据+应答信号+停止信号
需要分别模拟这四个环节,首先开GPIO资源:
static void I2C_GPIO_Config(){
GPIO_InitTypeDef GPIO_InitStruct;
/*开GPIO口时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;/*设置成开漏输出模式*/
GPIO_InitStruct.GPIO_Pin = I2C_SCL_PIN | I2C_SDA_PIN;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
/***初始化GPIO**/
GPIO_Init(I2C_GPIO_PORT, &GPIO_InitStruct);
GPIO_SetBits(I2C_GPIO_PORT, I2C_SCL_PIN | I2C_SDA_PIN);
}
使用了一些宏定义,这里输出模式设置成了开漏输出,对于开漏来说输出两种状态,低电平和高阻态,需要外接上拉电阻将高阻态时的电平拉高
|