基于固件库的软件i2c

软件i2c通过模拟i2c时序配置普通的gpio引脚,首先封装一个函数

在起始条件未开始之前把SDA,SCL拉高

基于固件库的软件i2c

接着封装模拟起始信号函数,在SCL高电平时,SDA从高电平向低电平跳变,发出起始信号,最后时钟线置低数据开始准备传输。

然后是封装i2c停止信号,在时钟线为高电平期间,SDA由低变高

4.应答信号

基于固件库的软件i2c

发送一个字节i2c数据,数据高位先行
此涉及数据有效性
SDA的高或低电平状态只有在 SCL 线的时钟信号是低电平时才能改变。
SDA在SCLSCL的上升沿到来前准备好,并在下降沿到来之前必须稳定。
为高电平时表示有效数据,SDA为高电平表示“1”,低电平表示“0”;SCL为低电平时表示无效数据,此时
SDA会进行电平切换,为下次数据表示做准备。数据有效性示意图如图所示。

基于固件库的软件i2c

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进行处理,非常感谢!

上一篇 2022年1月11日
下一篇 2022年1月11日

相关推荐