GPIO口模拟IIC--适用于任何ARM系列单片机
这个IIC协议呢,硬件IIC复杂且不好用,看资料说是怕侵权原子哥就做的很复杂,功能不好。所以在看的都是模拟IIC,配置的话就是IO口的配置
如果对您的问题有帮助的话可以帮忙点个赞,谢谢~QQ群:540093471 有问题大家可以一起交流沟通!
首先先讲一下模拟IIC的一些必用函数的逻辑。
空闲状态时SCL和SDA为高电平。
而且SDA必须在SCL为高电平时保持稳定(即在SCL来之前和走之后一段时间内不发生变化),在低电平时才可以发生反转。
主要包括:起始信号、终止信号、等待应答、发送应答、发送非应答。
首先是IIC的初始化,模拟IIC就用到的是IO口嘛,所以初始化也就是初始化IO口,最后都设置为高电平。
起始信号:在SCL为高电平的时候,SDA都高电平变为低电平
停止信号:在SCL为高电平的时候,SDA都低电平变为高电平
/******************************************iic起始信号******************************************/
void BuckBoost_IIC_LCD_Start(void)
{IIC_LCD_SDA_OUT();IIC_LCD_SCL_H;IIC_LCD_SDA_H;delay_us(5);IIC_LCD_SDA_L;//时钟为高的时候,数据从高到低为起始信号delay_us(5);IIC_LCD_SCL_L;//钳住I2C总线,准备发送或接收数据
}/******************************************iic停止信号******************************************/
void BuckBoost_IIC_LCD_Stop(void)
{IIC_LCD_SDA_OUT();IIC_LCD_SCL_L;IIC_LCD_SDA_L;IIC_LCD_SCL_H;delay_us(5);IIC_LCD_SDA_H;//时钟为高的时候,数据从低到高为停止信号 delay_us(5);
}
等待应答:应答信号时从机发送的,但是等待应该是主机等待从机的信号。在发送完一个字也就是8bit之后,第9位也就是第9个周期会有一个应答信号,以确保从机接收到了信号。等待不到应答就会发送停止信号,代表传输有错~
/******************************************iic等待应答信号1:无应答0:有应答******************************************/
uint8_t BuckBoost_IIC_LCD_Wait_Ack(void)
{uint8_t ERROR_STATUS=0;IIC_LCD_SDA_IN();/*一个数据的第8个周期状态*/IIC_LCD_SDA_H;delay_us(1);IIC_LCD_SCL_H;delay_us(1);while(IIC_LCD_ACK_READY){ERROR_STATUS++;if(ERROR_STATUS>250){BuckBoost_IIC_LCD_Stop();return 1;}}IIC_LCD_SCL_L; return 0;
}
发送应答:在一个时钟周期间SDA位低电平
发送非应答:在一个时钟周期间SDA位高电平
/******************************************iic发送应答信号iic发送非应答信号******************************************//*iic产生应答信号*/
void BuckBoost_IIC_LCD_Send_Ack(void)
{IIC_LCD_SCL_L;IIC_LCD_SDA_OUT(); IIC_LCD_SDA_L;//发送完一个信号后第9个周期间,SDA输出低代表应答状态delay_us(2);IIC_LCD_SCL_H;delay_us(2);IIC_LCD_SCL_L;}
/*iic产生非应答信号*/
void BuckBoost_IIC_LCD_Send_NAck(void)
{IIC_LCD_SCL_L;IIC_LCD_SDA_OUT(); IIC_LCD_SDA_H;//发送完一个信号后第9个周期间,SDA输出高代表非应答状态delay_us(2);IIC_LCD_SCL_H;delay_us(2);IIC_LCD_SCL_L;
}
上述都是一些模拟IIC的基本应用,接下来就介绍一些IIC的器件,也就是我们用来与单片机传输的IIC的器件
每个IIC器件都有自己的datasheet,不用的元器件有时候读写字节的方式也不一样,其实最重要的还是他们的地址不同以及内存大小不同。接下来两个图是AT24C02的读写字节的方式!
地址位置一般是8位 高5位为1010 A2 A1 A0 R/W,后三位要看硬件电路的方式。
//在AT24CXX指定地址读出一个数据
//ReadAddr:开始读数的地址
//返回值 :读到的数据
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{ u8 temp=0; IIC_Start(); if(EE_TYPE>AT24C16){IIC_Send_Byte(0XA0); //发送写命令IIC_Wait_Ack();IIC_Send_Byte(ReadAddr>>8);//发送高地址IIC_Wait_Ack(); }else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据 IIC_Wait_Ack(); IIC_Send_Byte(ReadAddr%256); //发送低地址IIC_Wait_Ack(); IIC_Start(); IIC_Send_Byte(0XA1); //进入接收模式 IIC_Wait_Ack(); temp=IIC_Read_Byte(0); IIC_Stop();//产生一个停止条件 return temp;
}
//在AT24CXX指定地址写入一个数据
//WriteAddr :写入数据的目的地址
//DataToWrite:要写入的数据
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{ IIC_Start(); if(EE_TYPE>AT24C16){IIC_Send_Byte(0XA0); //发送写命令IIC_Wait_Ack();IIC_Send_Byte(WriteAddr>>8);//发送高地址}else{IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据 } IIC_Wait_Ack(); IIC_Send_Byte(WriteAddr%256); //发送低地址IIC_Wait_Ack(); IIC_Send_Byte(DataToWrite); //发送字节 IIC_Wait_Ack(); IIC_Stop();//产生一个停止条件 delay_ms(10);
}
如果对您的问题有帮助的话可以帮忙点个赞,谢谢~QQ群:540093471 有问题大家可以一起交流沟通!
GPIO口模拟IIC--适用于任何ARM系列单片机相关推荐
- 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)
版权声明:本文为博主原创文章,允许转载,但希望标注转载来源. https://blog.csdn.net/qq_38410730/article/details/80312357 IIC的基本介绍 I ...
- linux gpio 模拟串口,STM32的GPIO口模拟串口通信.rar
[实例简介] 利用GPIO.EXTI外部中断.TIM定时器实现URAT串口,该例子来自21IC网,未做改动,明天自己调试,看看效果 完全是根据UART协议编写 [实例截图] [核心代码] STM32的 ...
- GPIO口模拟I2C操作
/* 作者:天空 日期:2014.5.12 功能:利用GPIO口模拟I2C总线,对传感器寄存器读取数据 注意:如果需要移植些文件到其他设 ...
- 3399使用GPIO口模拟i2c升级NT68411
RK3399使用GPIO口模拟i2c升级NT68411固件 sda = gpio_to_desc(129); //GPIO4_A1 scl = gpio_to_desc(130); //GPIO4_A ...
- 【msm8953】带clk的gpio口模拟pwm
1.选择带有clk功能的gpio33作为pwm模拟口: 2.配置设备树 ① 在msm8953-pinctrl.dtsi添加: 位置:kernel/msm-3.18/arch/arm64/boot/dt ...
- GPIO口模拟串口发送接收(基于H861)
以前常听说码农需要有严密的逻辑思维,以前不明白.没有思维框架,真的很难写代码,不能瞎蒙,等我的只是效率低下 思路 首先我们要模拟串口通信,就要了解通信的必须条件,包括数据位及其他标志位,以及他的时序, ...
- 用GPIO口模拟串口通信,它真的来了
你是否遇到过某个MCU串口不够的情况? 这时我们可以考虑用GPIO去模拟,如何具体实现呢? 首选我们需要了解串口的传输协议, UART使用异步模式工作,不需要时钟信号,其一般格式为:起始位+数据位+校 ...
- IO口软件模拟IIC
一.IIC时序 IIC(Inter-Integrated Circuit, 内部集成电路)总线是飞利浦公司开发的两线式串行总线,用于短距离传输,常用语微控制器及其外围设备.它是由数据线SDA和时钟线S ...
- 【蓝桥杯嵌入式】【STM32】5_IICEEPROM之软件模拟IIC
文章目录 1.原理图 2.源代码 下载工程文件: https://gitee.com/Joseph_Cooper/blue-bridge-embedded 1.原理图 顺便指出了该器件的地址. ...
最新文章
- 【周末阅读】2019自动驾驶十大关键词
- 【APICloud系列|28】 UIChatBox 模块(聊天输入框)的实现
- caffe SigmoidCrossEntropyLossLayer
- 洛谷 P1396 营救
- 获取div中的内容写法
- BigDecimal 小数 浮点数 精度 财务计算
- 华为/华三IS-IS单区域配置
- mybatis动态sql,条件判断详解示例
- 二调建设用地地类代码_二调地类和三调地类的对比
- 如何免密操作 github、gitee 远程仓库
- 使用CASEWHEN批量拼凑Update语句
- 计算机应用基础的重点知识,《计算机应用基础知识》重点总结
- 使用Flying Saucer生成pdf
- 一文读懂 Kafka 事务机制
- python绘制分形图基础_python绘制分形图
- 云宏大讲坛 | Ceph分布式存储高性能设计
- 振弦式渗压计渗流孔隙水压立计应用地基内部渗透水压力
- Java SE 部分基础知识
- CD19药物|适应症|市场销售-上市药品前景分析
- 超大数相乘的java代码,java版大数相乘