IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 10,5 IIC总线 -> 正文阅读

[嵌入式]10,5 IIC总线

概念

e7cf7c42272b4bdd9f10c2b9412b870d.png

I2C(IIC) 时序

1,起始信号

备注:起始信号和终止信号都是由主机产生的,起始信号产生之后,总线处于占用状态, 终止信号产生之后,总线处于空闲状态

起始信号:在SCL为高电平期间,SDA(数据线)从高电平到低电平的变化(下降沿)

2,停止信号

停止信号:在SCL为高电平期间,SDA(数据线)从低电平到高电平的变化(上升沿)

3,数据传输

IIC总线传输时,时钟信号在高电平期间,数据线上的数据必须保持稳定(接收器可以从总线上读取数据)

时钟信号在低电平期间,数据线上的数据允许发生变化(发送器可以向数据线上写数据)

4,应答信号和非应答信号

每一个字节必须保证是8位的长度,数据传送时,先发送高位,在发送低位,一帧数据=8位数据位+1位应答位=9位

发送器在发送完8位的数据位之后,接收器必须在第9个时钟周期,返回一个应答信号(0),或者非应答信号(1)

5,寻址

IIC总线上传输数据是广义的,既可以是地址信号,也可以是数据信号

主机在起始信号产生之后,必须要传送一个7位的从机地址,第8位是数据传输的方向位

框图

3ae405795eb14a7fbf607c39a9b6a4cc.png

协议

458e6a1f3b2842098155547a399976e4.png

主要代码

extern void printf(const char* fmt, ...);
void delay_us(void)
{
?? ?unsigned int i = 2000;
?? ?while(i--);
}

void i2c_init(void)
{
?? ?RCC->MP_AHB4ENSETR |= (0x1 << 5);
?? ?GPIOF->MODER &= (~(0xF << 28));
?? ?GPIOF->MODER |= (0x5 << 28);
?? ?GPIOF->OTYPER &= (~(0x3 << 14));
?? ?GPIOF->OSPEEDR |= (0xF << 28);
?? ?GPIOF->PUPDR &= (~(0xF << 28));
?? ?I2C_SCL_H;
?? ?I2C_SDA_H;
}

void i2c_start(void)
{
?? ?SET_SDA_OUT;
?? ?I2C_SCL_H;
?? ?I2C_SDA_H;
?? ?delay_us();
?? ?I2C_SDA_L;
?? ?delay_us();
?? ?I2C_SCL_L;
?? ?delay_us();
}

void i2c_stop(void)
{
?? ?SET_SDA_OUT;
?? ?I2C_SCL_L;
?? ?delay_us();
?? ?I2C_SDA_L;
?? ?delay_us();
?? ?I2C_SCL_H;
?? ?delay_us();

?? ?I2C_SDA_H;
?? ?delay_us();
}

void i2c_write_byte(unsigned char dat)
{
?? ?unsigned int i;
?? ?SET_SDA_OUT;
?? ?for(i=0;i<8;i++)
?? ?{
?? ??? ?I2C_SCL_L;
?? ??? ?delay_us();
?? ??? ?if(dat&0x80)
?? ??? ?{
?? ??? ??? ?I2C_SDA_H;
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?I2C_SDA_L;
?? ??? ?}
?? ??? ?delay_us();
?? ??? ?I2C_SCL_H;
?? ??? ?delay_us();
?? ??? ?delay_us();
?? ??? ?dat<<=1;

?? ?}
}

unsigned char i2c_read_byte(unsigned char ack)
{
?? ?unsigned int i;
?? ?SET_SDA_IN;
?? ?unsigned char dat;
?? ?for(i=0;i<8;i++)
?? ?{
?? ??? ?I2C_SCL_L;
?? ??? ?delay_us();
?? ??? ?delay_us();

?? ??? ?I2C_SCL_H;
?? ??? ?delay_us();
?? ??? ?dat<<=1;
?? ??? ?if(I2C_SDA_READ)
?? ??? ?{
?? ??? ??? ?dat |=1;
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?dat |=0;
?? ??? ?}
?? ??? ?delay_us();
?? ?}
?? ?if(!ack)
?? ??? ?i2c_ack();
?? ?else
?? ??? ?i2c_nack();
?? ?return dat;
}

unsigned char i2c_wait_ack(void)
{?? ?
?? ?I2C_SCL_L;
?? ?I2C_SDA_H;
?? ?delay_us();
?? ?SET_SDA_IN;
?? ?I2C_SCL_H;
?? ?delay_us();
?? ?if(I2C_SDA_READ)
?? ?{
?? ??? ?return 1;
?? ?}
?? ?I2C_SCL_L;
?? ?return 0;
}?

void i2c_ack(void)
{
?? ?SET_SDA_OUT;
?? ?I2C_SCL_L;
?? ?delay_us();
?? ?I2C_SDA_L;
?? ?delay_us();
?? ?I2C_SCL_H;
?? ?delay_us();
?? ?delay_us();
?? ?I2C_SCL_L;


}

void i2c_nack(void)
{
?? ?SET_SDA_OUT;
?? ?I2C_SCL_L;
?? ?delay_us();
?? ?I2C_SDA_H;
?? ?delay_us();
?? ?I2C_SCL_H;
?? ?delay_us();
?? ?delay_us();
?? ?I2C_SCL_L;
}
?

?

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-10-08 20:58:04  更:2022-10-08 21:01:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 17:45:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码