软件i2c通过模拟i2c时序配置普通的gpio引脚,首先封装一个函数
在起始条件未开始之前把SDA,SCL拉高
接着封装模拟起始信 函数,在SCL高电平时,SDA从高电平向低电平跳变,发出起始信 ,最后时钟线置低数据开始准备传输。
然后是封装i2c停止信 ,在时钟线为高电平期间,SDA由低变高
4.应答信
发送一个字节i2c数据,数据高位先行
此涉及数据有效性
SDA的高或低电平状态只有在 SCL 线的时钟信 是低电平时才能改变。
SDA在SCLSCL的上升沿到来前准备好,并在下降沿到来之前必须稳定。
为高电平时表示有效数据,SDA为高电平表示“1”,低电平表示“0”;SCL为低电平时表示无效数据,此时
SDA会进行电平切换,为下次数据表示做准备。数据有效性示意图如图所示。
I2c写命令
代码整合
.c代码
#include "stm32f10x.h"#include "oled.h"#include "oledfont.h"#include "delay.h"static void OLED_GPIO_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStructure); OLED_SCLK_Set(); OLED_SDIN_Set(); }static void OLED_IIC_Start(void){ OLED_SCLK_Set(); OLED_SDIN_Set(); delay_us(1); OLED_SDIN_CLr(); delay_us(1); OLED_SCLK_CLr(); delay_us(1);}static void OLED_IIC_Stop(void){ OLED_SDIN_CLr(); delay_us(1); OLED_SCLK_Set(); delay_us(1); OLED_SDIN_Set(); delay_us(1);}static unsigned char IIC_Wait_Ack(void){ unsigned char ack; OLED_SCLK_CLr声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!