void ()
= 1; //首先确保SDA、SCL都是高电平
= 1;
();
= 0; //先拉低SDA
();
= 0; //再拉低SCL
/* 产生总线停止信号 */
void ()
= 0; //首先确保SDA、SCL都是低电平
= 0;
();
= 1; //先拉高SCL
();
= 1; //再拉高SDA
();
/* I2C总线写操作 , dat-待写入字节 , 返回值-从机应答位的值 */
bit ( char dat)
{ bit ack; //用于暂存应答位的值char mask; //用于探测字节内某一位值的掩码变量
for (mask=0x80; mask!=0; mask>>=1) //从高位到低位依次进行
{ if ((mask&dat) == 0) //该位的值输出到SDA上
= 0; else
= 1;
();
= 1; //拉高SCL
();
= 0; //再拉低SCL , 完成一个位周期
= 1; //8位数据发送完后 , 主机释放SDA , 以检测从机应答
();
= 1; //拉高SCL
ack = ; //读取此时的SDA值 , 即为从机的应答值
();
= 0; //再拉低SCL完成应答位 , 并保持住总线
(~ack); //应答值取反以符合通常的逻辑:
//0=不存在或忙或写入失败 , 1=存在且空闲或写入成功
在整个过程中 , SCL均由单片机来操作 。无论是起始、读、写操作函数 , 在调用这些函数之后SCL被提前拉低 。
I2C 通信分为低速模式 /s、快速模式 /s 和高速模式 3.4Mbit/s 。在使用/s时需要SCL 的高低电平持续时间都不短于 5us 。
单片机与用IIC通信的例子:
单片机写:
第一步 , 发送 I2C 的起始信号 , 接着跟上I2C 的器件地址 , 在读写方向上选择“写”操作 。
第二步 , 发送数据的存储地址 。24C02 一共 256 个字节的存储空间 , 地址从 0x00~0xFF , 我们想把数据存储在哪个位置 , 此刻写的就是哪个地址 。
第三步 , 发送要存储的数据第一个字节、第二个字节…在写数据的过程中 , 每个字节都会回应一个“应答位 0” , 来告诉我们写数据成功 , 如果没有回应答位 , 说明写入不成功 。
在写数据的过程中 , 每成功写入一个字节 , 存储空间的地址就会自动加 1 , 当加到 0xFF 后 , 再写一个字节 , 地址会溢出又变成了 0x00 。
/* 向中写入一个字节 , addr-字节地址 */
void ( char addr,char dat)
();
【1、学习三极管的使用】(0x50
- 齐齐哈尔天气预报
- 无锡、鼋头渚、灵山等。太湖中国最大的淡水湖之一被誉为江南明珠 太湖中国之最
- 郑州“7.20”特大暴雨灾害调查报告出炉!解读“重面子、轻里子” 郑州720历史之最
- 陪我去青康藏高原
- 岗位内推 | 小红书商业广告部门招聘广告算法、广告系统开发工程师
- OpenCV学习笔记--第一个OpenCV程序:图片读写显示
- 按下亮 松开灭 c语言程序,单片机用c语言,按钮控制一个LED灯,要求按下松开
- 马术表演、环球飞车、惊险杂技……在滨海新区看顶级马戏节 飞奔闯关最快吉尼斯记录
- 引领六项世界之最,解决十大世界级技术难题,他是滇中引水总工程师、昆明瀑布公园设计者 世界之最的瀑布
- 稀奇|天津惊现“神秘生物”!外貌、性情世界罕见! 动植物世界之最