OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3406|回复: 2

STMF4的I2C程序和C51I2C程序的区别

[复制链接]

45

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2016-12-29
在线时间
47 小时
发表于 2017-1-10 23:35:30 | 显示全部楼层 |阅读模式
举个例子:结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。 这是库函数指南上写的 ,正确I2C协议
void IIC_Stop(void)
{
SDA_OUT();//sda线输出
IIC_SCL=0;                                                                                                     一开始SCL,SDA是低电平,延时4US  SCL变高电平,然后SDA变高电平,延时。这能识别出来结束信号吗?
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);
这是我以前看到用C51写的
void ADXL345_Stop()
{
    SDA = 0;                    //拉低数据线                     先让SCL变高,然后延时,SDA再拉高。 同样是SCL先高SDA再高,但我总觉得这个更符合,或是更安全。。。
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SDA = 1;                    //产生上升沿
    Delay5us();                 //延时
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

45

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2016-12-29
在线时间
47 小时
 楼主| 发表于 2017-1-10 23:35:58 | 显示全部楼层
回复 支持 反对

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2082
金钱
2082
注册时间
2014-12-19
在线时间
711 小时
发表于 2017-1-11 08:20:41 | 显示全部楼层
void ADXL345_Stop()
如果之前SCL是高电平,那么SDA拉低的话就会被认为是Start了。所以先拉低SCL比较保险。
但不加一般也是没有问题的。因为如果一直按照流程来运行,Start,发送、接收 数据和Ack/nack最后都会拉低SCL。所以通常发送Stop之前SCL已经是低电平了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 18:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表