OpenEdv-开源电子网

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

关于IIC引脚的困惑

[复制链接]

1

主题

2

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-1-27
在线时间
6 小时
发表于 2016-3-16 11:52:07 | 显示全部楼层 |阅读模式
1金钱
买了战舰开发板,进行到IIC通信部分,我有个疑问——既然程序用的是模拟IIC,换句话说,我只要更换SDA和SCL引脚,也能实现IIC通信,可是实际却不行~[mw_shl_code=applescript,true]void IIC_Init(void)
{                                             
        RCC->APB2ENR|=1<<3;                //先使能外设IO PORTB时钟
        GPIOB->CRL&=0X00FFFFFF;        //PB6/7推挽输出
        GPIOB->CRL|=0X33000000;          
        GPIOB->ODR|=3<<6;             //PB6,7输出高
}[/mw_shl_code]
[mw_shl_code=applescript,true]
#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
#define IIC_SCL    PBout(6)
#define IIC_SDA    PBout(7)
#define READ_SDA   PBin(7)         [/mw_shl_code]
以上是myicc.h和myicc.c中,关于引脚的定义,这部分,小弟能懂,然后,我将板上P4短路帽拔掉,外接eeprom的SDA到PA10,SCL到PA9
程序改动如下:
[mw_shl_code=applescript,true]void IIC_Init(void)
{       
RCC->APB2ENR|=1<<2;
GPIOA->CRH&=0XFFFFF00F;
GPIOA->CRH|=0X00000330;
GPIOA->ODR|=3<<9;
}[/mw_shl_code]
[mw_shl_code=applescript,true]
#define SDA_IN() {GPIOA->CRL&=0XFFFFF0FF;GPIOA->CRL|=(u32)8<<28;}
#define SDA_OUT() {GPIOA->CRL&=0XFFFFF0FF;GPIOA->CRL|=(u32)3<<28;}
#define IIC_SCL PAout(9)
#define IIC_SDA PAout(10)
#define READ_SDA PAin(10) [/mw_shl_code]

运行后,液晶屏显示"24C02 Check Failed!",一直都无法连上EEPROM,求各位指教,我只修改这部分代码,是修改错误,还是漏了某些地方没修改
另外,我看好多例程都用PB6,PB7做IIC引脚,虽然他们是硬件IIC引脚,但就没人试过用其他脚来模拟?

最佳答案

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

#define SDA_IN() {GPIOA->CRL&=0XFFFFF0FF;GPIOA->CRL|=(u32)8CRL|=(u32)3
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-3-16 11:52:08 | 显示全部楼层
#define SDA_IN() {GPIOA->CRL&=0XFFFFF0FF;GPIOA->CRL|=(u32)8<<28;}
#define SDA_OUT() {GPIOA->CRL&=0XFFFFF0FF;GPIOA->CRL|=(u32)3<<28;}

改为CRH,然后移位位数自己计算.
CRL只能控制0~7.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11544
金钱
11544
注册时间
2014-4-1
在线时间
1315 小时
发表于 2016-3-16 16:23:04 | 显示全部楼层

随便一个IO,既可以做SDA,也可以做SCL。
道理没错。

可能设置有问题,
或者没有加上拉电阻?

回复

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-1-27
在线时间
6 小时
 楼主| 发表于 2016-3-17 11:32:50 | 显示全部楼层
xuande 发表于 2016-3-16 16:23
随便一个IO,既可以做SDA,也可以做SCL。
道理没错。

这个模块在Arduino-UNO中直接接在引脚上能正确读写,应该模块自带上拉
设置的话,参考原子战舰的例程,SCL和SDA的引脚相关控制的代码应该在myicc.h和myicc.c中,EEPROM的默认地址也是0xA0,不明所以
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11544
金钱
11544
注册时间
2014-4-1
在线时间
1315 小时
发表于 2016-3-17 11:42:49 | 显示全部楼层

随便一个IO,既可以做SDA,也可以做SCL。
这可以肯定。
电路板端口随便换,用过N次了。

到底上拉没有,要坚查一下。首先要保证硬件。
很多人用内部上拉,也可以正常工作,但这样不可靠。

还是觉得软件问题大。


回复

使用道具 举报

6

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2016-4-12
在线时间
97 小时
发表于 2016-6-17 20:39:02 | 显示全部楼层
楼主问题解决了么  我用的是库函数  也遇到相同的问题了
回复

使用道具 举报

13

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2015-12-3
在线时间
46 小时
发表于 2016-8-1 18:44:23 | 显示全部楼层
我用PB6,7不行,用10,11却行?怎么破!!
学到老,活到老
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2016-8-2 09:41:48 | 显示全部楼层
寄存器表示没看懂
回复

使用道具 举报

15

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
274
金钱
274
注册时间
2016-7-15
在线时间
88 小时
发表于 2016-8-2 09:43:40 | 显示全部楼层
顶起来
回复

使用道具 举报

2

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
269
金钱
269
注册时间
2015-11-2
在线时间
58 小时
发表于 2016-8-2 10:39:32 | 显示全部楼层
#define SDA_IN() {GPIOA->CRL&=0XFFFFF0FF;GPIOA->CRL|=(u32)8<<28;}
#define SDA_OUT() {GPIOA->CRL&=0XFFFFF0FF;GPIOA->CRL|=(u32)3<<28;}

用A10做SDA 可不是(u32)8<<28了
把<<28改成<<8试试
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 14:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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