当前位置:网站首页>【正点原子】IIC的学习与使用(未完...)
【正点原子】IIC的学习与使用(未完...)
2022-07-30 05:45:00 【Clockwisee】
前言
由于b站江科大自化协的stm32c8t6视频暂时没有更新IIC通信的视频,所以这里跟着正点原子官方视频学了。
IIC简介

I2C协议

协议与代码
空闲状态-开始信号-停止信号的代码使用
//产生IIC起始信号
void IIC_Start(void)
{
SDA_OUT(); //sda线输出
IIC_SDA=1; //SDA = 1,SCL = 1 空闲状态
IIC_SCL=1;
delay_us(4);
IIC_SDA=0;//START:when CLK is high,DATA change form high to low
delay_us(4);
IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}
//产生IIC停止信号
void IIC_Stop(void)
{
SDA_OUT();//sda线输出
IIC_SCL=0;SDA = 0,SCL = 0 才能准备停止信号
IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
delay_us(4);
IIC_SCL=1;
IIC_SDA=1;//发送I2C总线结束信号
delay_us(4);
}

//等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN(); //SDA设置为输入
IIC_SDA=1;delay_us(1);
IIC_SCL=1;delay_us(1);
while(READ_SDA)//数据线是 高 就一直等,等不到低电平就认为是无效的
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;//时钟输出0 低电平
return 0;
}
应答信号
//产生ACK应答
void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0; //SDA始终为 低 产生应答
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
//不产生ACK应答
void IIC_NAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1; //SDA始终为 高 不产生应答
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
下面就是发送一个字节和读取一个字节的函数
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
IIC_SCL=0;//拉低时钟开始数据传输
for(t=0;t<8;t++)
{
//IIC_SDA=(txd&0x80)>>7;
if((txd&0x80)>>7) //准备数据
IIC_SDA=1;
else
IIC_SDA=0;
txd<<=1;
delay_us(2); //对TEA5767这三个延时都是必须的
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
delay_us(2);
}
}
如下图所示
SDA在SCL为低电平时候准备数据,SCL在0、1、0变化过程中,SDA时钟为高电平
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();//SDA设置为输入 在SCL为高电平时候读取信号,与发送刚好相反
for(i=0;i<8;i++ )
{
IIC_SCL=0;
delay_us(2);
IIC_SCL=1;
receive<<=1; //整个数据往左移一位,假如接收了五位,00012345,读取数据6,左移一位00123456
if(READ_SDA)receive++; //左移后最低为变为0 对最低位进行++
delay_us(1);
}
if (!ack)
IIC_NAck();//发送nACK 不应答信号
else
IIC_Ack(); //发送ACK 应答信号
return receive;
}
EEPROM(24C02)
边栏推荐
- 常用损失函数(一):Focal Loss
- Conda 安装 tensorflow gpu 1.13.1(验证可行)
- Generalized Focal Loss 论文阅读笔记
- MySQL 特殊语句及优化器
- 昆仑通态屏幕制作(连载4)---基础篇(图形设定与显示,按钮灯)
- 点云统计滤波理解
- MySQL index optimization and failure scenarios
- Self-augmented Unpaired Image Dehazing via Density and Depth Decomposition程序运行记录
- 21. Kotlin Advanced Learning: Implementing Simple Network Access Encapsulation
- 第一个WebAssembly程序
猜你喜欢

QT每周技巧(2)~~~~~~~~~界面按钮

Flink-stream/batch/OLAP integrated to get Flink engine

边境的悍匪—机器学习实战:第九章 无监督学习任务

九、Kotlin基础学习:1、Companion的扩展方法和扩展属性;2、一般类的扩展方法和扩展属性;3、委托;

nodejs PM2监控及报警邮件发送(二)

Generalized Focal Loss paper reading notes

二十一、Kotlin进阶学习:实现简单的网络访问封装

The types of data structures and MySQL index

MATLAB怎么在图像中显示nii文件切片信息?

R-GIS: 如何用R语言实现GIS地理空间分析及模型预测
随机推荐
FPGA解析B码----连载2
基于全球模式比较计划CMIP6与区域气候-化学耦合模式 WRF-Chem 的未来大气污染变化模拟
Receive emails from gmail with pop3
Pytorch(三):可视化工具(Tensorboard、Visdom)
边境的悍匪—机器学习实战:第七章 集成学习和随机森林
边境的悍匪—机器学习实战:第九章 无监督学习任务
边境的悍匪—机器学习实战:第六章 决策树
联影医疗一面
边境的悍匪—机器学习实战:第十章 Keras人工神经网络简介
MySQL 特殊语句及优化器
无人机生态环境监测、图像处理与GIS数据分析
Analysis of domestic data exchange platforms
昆仑通态屏幕制作(连载5)---基础篇(串口接收,文本与灯显示)
QT每周技巧(2)~~~~~~~~~界面按钮
CLUE Model Construction Method, Model Validation and Land Use Change Scenario Prediction
十三、Kotlin进阶学习:内联函数let、also、with、run、apply的用法。
Rsync实现Win系统间的文件夹或数据同步
Trust anchor for certification path not found. Exception solution.
第一个WebAssembly程序
关于map对key自定义排序