OpenEdv-开源电子网

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

有没有人用过拿51编写的I2C程序翻译成STMF4的代码

[复制链接]

45

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2016-12-29
在线时间
47 小时
发表于 2017-1-10 20:36:48 | 显示全部楼层 |阅读模式
10金钱
就用STMF4的库函数实现的,我看过探索者给的I2C源程序,用来和什么通信的我不认识,但是好像时序和我那个对不上,我就自己把以前51的程序重新翻译了份,挪用了源程序的
#define SDA_IN()  {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=0<<9*2;} //PB9输入模式
#define SDA_OUT() {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=1<<9*2;} //PB9输出模式
我的SDA是PA2。。不知道怎么改,主要切换输入输出模式嘛。。现在还没做出来忙了一天。。有谁做过这东西的告诉我怎么改,要注意点什么。。

最佳答案

查看完整内容[请看2#楼]

延时不同使得通讯的速度改变而已,延时太短有时候可能通讯不正常,就要加长延时。SCL从低电平变化到下一个低电平的时间不要短于2.5us(400kbit/s)就行。当然,高低电平的稳定时间可以是相同,或者是低电平时长是高电平时长的2倍。这2种是比较常用的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2082
金钱
2082
注册时间
2014-12-19
在线时间
711 小时
发表于 2017-1-10 20:36:49 | 显示全部楼层
我要学习嵌入式 发表于 2017-1-11 11:01
void IIC_Ack(void)
{
        IIC_SCL=0;

延时不同使得通讯的速度改变而已,延时太短有时候可能通讯不正常,就要加长延时。SCL从低电平变化到下一个低电平的时间不要短于2.5us(400kbit/s)就行。当然,高低电平的稳定时间可以是相同,或者是低电平时长是高电平时长的2倍。这2种是比较常用的。
回复

使用道具 举报

45

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2016-12-29
在线时间
47 小时
 楼主| 发表于 2017-1-10 20:39:28 | 显示全部楼层
搞错 PA3 SDA
回复

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
发表于 2017-1-11 09:44:56 | 显示全部楼层
看看原子哥库函数版本的吧,寄存器的太晕了
回复

使用道具 举报

45

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2016-12-29
在线时间
47 小时
 楼主| 发表于 2017-1-11 11:01:54 | 显示全部楼层
void IIC_Ack(void)
{
        IIC_SCL=0;
        SDA_OUT();
        IIC_SDA=0;
        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;
        delay_us(2);
        IIC_SCL=1;
        delay_us(2);
        IIC_SCL=0;
}        为什么库函数这个应答信号只有4US 别的8US
。。我两个都有看,正在看
回复

使用道具 举报

45

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2016-12-29
在线时间
47 小时
 楼主| 发表于 2017-1-11 12:44:38 | 显示全部楼层
lvehe 发表于 2017-1-10 20:36
延时不同使得通讯的速度改变而已,延时太短有时候可能通讯不正常,就要加长延时。SCL从低电平变化到下一 ...

可是这是同一个I2C函数里的 起始和终止都是8US 就ACK 4US。这是为了加快速度吗?只要信号传过去了  ,限制好最低所要通讯的速率?
回复

使用道具 举报

45

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2016-12-29
在线时间
47 小时
 楼主| 发表于 2017-1-11 12:47:09 | 显示全部楼层
lvehe 发表于 2017-1-10 20:36
延时不同使得通讯的速度改变而已,延时太短有时候可能通讯不正常,就要加长延时。SCL从低电平变化到下一 ...

大神 再问个问题 再接受SLAVE的数据时 为什么函数里开始要拉高SDA。是跟上拉输入有关吗?我记得前几天有个人也那么问
回复

使用道具 举报

45

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2016-12-29
在线时间
47 小时
 楼主| 发表于 2017-1-11 13:38:56 | 显示全部楼层
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;
                }
        }
回复

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2082
金钱
2082
注册时间
2014-12-19
在线时间
711 小时
发表于 2017-1-11 18:25:18 | 显示全部楼层
我要学习嵌入式 发表于 2017-1-11 12:44
可是这是同一个I2C函数里的 起始和终止都是8US 就ACK 4US。这是为了加快速度吗?只要信号传过去了  ,限 ...

8us和4us都没关系,不信你试试。现在一般的器件都能支持400kbit/s的通讯速率,所以4us对它们来说已经足够,不会出问题。
回复

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2082
金钱
2082
注册时间
2014-12-19
在线时间
711 小时
发表于 2017-1-11 18:31:30 | 显示全部楼层
我要学习嵌入式 发表于 2017-1-11 12:47
大神 再问个问题 再接受SLAVE的数据时 为什么函数里开始要拉高SDA。是跟上拉输入有关吗?我记得前几天有 ...

如果你理解了开漏模式就知道为什么要拉高了,实际上,这里的拉高有的时候用更容易理解的“释放”来表示,也就是主机释放对SDA的控制权。释放之后,因为上拉电阻的缘故,所以就表现为高电平。因为此时要读取从机的数据,所以SDA由从机来拉高或拉低,主机就读取SDA的电平。用开漏模式就可以使SCL和SDA表现为双向口。而不必像原子做的那样,一会儿设置为输出,一会儿设置为输入,太麻烦了。
回复

使用道具 举报

45

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2016-12-29
在线时间
47 小时
 楼主| 发表于 2017-1-11 20:40:58 | 显示全部楼层
lvehe 发表于 2017-1-11 18:31
如果你理解了开漏模式就知道为什么要拉高了,实际上,这里的拉高有的时候用更容易理解的“释放”来表示, ...

这又不清楚了。。。开漏不是无信号时是低电平吗。而且我一直以为如果是输出模式就必须输出不能输入,输入模式就必须输入。输出是无效的。
回复

使用道具 举报

45

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2016-12-29
在线时间
47 小时
 楼主| 发表于 2017-1-11 20:45:10 | 显示全部楼层
lvehe 发表于 2017-1-11 18:31
如果你理解了开漏模式就知道为什么要拉高了,实际上,这里的拉高有的时候用更容易理解的“释放”来表示, ...

我学习这芯片看入门指南好像什么部分都只明白一半,感觉自己做就不明白原理,没有思路
回复

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2082
金钱
2082
注册时间
2014-12-19
在线时间
711 小时
发表于 2017-1-11 21:21:00 | 显示全部楼层
我要学习嵌入式 发表于 2017-1-11 20:45
我学习这芯片看入门指南好像什么部分都只明白一半,感觉自己做就不明白原理,没有思路

初学者不要太钻牛角尖,很多东西不是一时半会理解得了的。先让程序能正常运行再说。
回复

使用道具 举报

45

主题

135

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2016-12-29
在线时间
47 小时
 楼主| 发表于 2017-1-11 22:22:26 | 显示全部楼层
lvehe 发表于 2017-1-11 21:21
初学者不要太钻牛角尖,很多东西不是一时半会理解得了的。先让程序能正常运行再说。

可是现在我把原子程序放到我的程序里去接收数据,也不显示,就好像无法进那个EXTI1一样。加在MAIN里的发送函数倒是能显示出来有发送,(TX灯亮)但是好像波特率不相同,串口显示不出来,觉得是系统时钟和外设时钟设置有问题,只是因为没用原子的USART1函数。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 20:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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