这个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系列单片机相关推荐

  1. 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)

    版权声明:本文为博主原创文章,允许转载,但希望标注转载来源. https://blog.csdn.net/qq_38410730/article/details/80312357 IIC的基本介绍 I ...

  2. linux gpio 模拟串口,STM32的GPIO口模拟串口通信.rar

    [实例简介] 利用GPIO.EXTI外部中断.TIM定时器实现URAT串口,该例子来自21IC网,未做改动,明天自己调试,看看效果 完全是根据UART协议编写 [实例截图] [核心代码] STM32的 ...

  3. GPIO口模拟I2C操作

    /*         作者:天空         日期:2014.5.12         功能:利用GPIO口模拟I2C总线,对传感器寄存器读取数据         注意:如果需要移植些文件到其他设 ...

  4. 3399使用GPIO口模拟i2c升级NT68411

    RK3399使用GPIO口模拟i2c升级NT68411固件 sda = gpio_to_desc(129); //GPIO4_A1 scl = gpio_to_desc(130); //GPIO4_A ...

  5. 【msm8953】带clk的gpio口模拟pwm

    1.选择带有clk功能的gpio33作为pwm模拟口: 2.配置设备树 ① 在msm8953-pinctrl.dtsi添加: 位置:kernel/msm-3.18/arch/arm64/boot/dt ...

  6. GPIO口模拟串口发送接收(基于H861)

    以前常听说码农需要有严密的逻辑思维,以前不明白.没有思维框架,真的很难写代码,不能瞎蒙,等我的只是效率低下 思路 首先我们要模拟串口通信,就要了解通信的必须条件,包括数据位及其他标志位,以及他的时序, ...

  7. 用GPIO口模拟串口通信,它真的来了

    你是否遇到过某个MCU串口不够的情况? 这时我们可以考虑用GPIO去模拟,如何具体实现呢? 首选我们需要了解串口的传输协议, UART使用异步模式工作,不需要时钟信号,其一般格式为:起始位+数据位+校 ...

  8. IO口软件模拟IIC

    一.IIC时序 IIC(Inter-Integrated Circuit, 内部集成电路)总线是飞利浦公司开发的两线式串行总线,用于短距离传输,常用语微控制器及其外围设备.它是由数据线SDA和时钟线S ...

  9. 【蓝桥杯嵌入式】【STM32】5_IICEEPROM之软件模拟IIC

    文章目录 1.原理图 2.源代码   下载工程文件:   https://gitee.com/Joseph_Cooper/blue-bridge-embedded 1.原理图 顺便指出了该器件的地址. ...

最新文章

  1. 【周末阅读】2019自动驾驶十大关键词
  2. 【APICloud系列|28】 UIChatBox 模块(聊天输入框)的实现
  3. caffe SigmoidCrossEntropyLossLayer
  4. 洛谷 P1396 营救
  5. 获取div中的内容写法
  6. BigDecimal 小数 浮点数 精度 财务计算
  7. 华为/华三IS-IS单区域配置
  8. mybatis动态sql,条件判断详解示例
  9. 二调建设用地地类代码_二调地类和三调地类的对比
  10. 如何免密操作 github、gitee 远程仓库
  11. 使用CASEWHEN批量拼凑Update语句
  12. 计算机应用基础的重点知识,《计算机应用基础知识》重点总结
  13. 使用Flying Saucer生成pdf
  14. 一文读懂 Kafka 事务机制
  15. python绘制分形图基础_python绘制分形图
  16. 云宏大讲坛 | Ceph分布式存储高性能设计
  17. 振弦式渗压计渗流孔隙水压立计应用地基内部渗透水压力
  18. Java SE 部分基础知识
  19. CD19药物|适应症|市场销售-上市药品前景分析
  20. 超大数相乘的java代码,java版大数相乘

热门文章

  1. 随机生成手机号 JS
  2. 计算机毕业设计ssm基于SSM框架在线电影评论投票系统3gr0f系统+程序+源码+lw+远程部署
  3. 如何更合规、更安全的使用人脸识别进行身份管理
  4. 关于分布式存储,这是你应该知道的(图文详解)
  5. ERP解决方案和开源标准物质的企业生产力
  6. 关于S50卡密钥A和密钥B
  7. 基于pandas的电影评分差异分析
  8. java从入门到精通pdf下载,太香了
  9. 为什么要做高新?高新技术企业和科技型企业的区别?
  10. ScriptManager 控件概述