OpenEdv-开源电子网

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

关于更换引脚IIC驱动的问题

[复制链接]

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2011-3-31
在线时间
0 小时
发表于 2011-3-31 08:35:04 | 显示全部楼层 |阅读模式

原子大哥,请问开发板上原来用的PC11(SCL)和PC12(SDA)脚的,现在我想改用PB6和PB7,下面这个是我的设置,你能帮我看看哪里错了?现在它check不到24c02
原来设置
void IIC_Init(void)
{         
  RCC->APB2ENR|=1<<4;//先使能外设IO PORTC时钟        
 GPIOC->CRH&=0XFFF00FFF;//PC11/12 推挽输出
 GPIOC->CRH|=0X00033000;   
 GPIOC->ODR|=3<<11;     //PC11,12 输出高
}

//IO方向设置
#define SDA_IN()  {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;}
#define SDA_OUT() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=3<<12;}

//IO操作函数 
#define IIC_SCL    PCout(12) //SCL
#define IIC_SDA    PCout(11) //SDA 
#define READ_SDA   PCin(11)  //输入SDA
我的设置
 RCC->APB2ENR|=1<<3;//先使能外设IO PORTB时钟
 GPIOB->CRL&=0X00FFFFFF;//PB6/PB7 推挽输出
 GPIOB->CRL|=0X33000000; 
 GPIOB->ODR|=1<<6;     //PB6/PB7  输出高
 GPIOB->ODR|=1<<7;     //PB6/PB7  输出高
 
//IO方向设置
#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<6;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<6;}

//IO操作函数 
#define IIC_SCL    PBout(6) //SCL
#define IIC_SDA    PBout(7) //SDA 
#define READ_SDA   PBin(7)  //输入SDA

还有PB6和PB7它原来就有IIC第二功能的请问能用它来驱动现在的iic芯片吗?具体又怎么实现,谢谢!

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-3-31 11:27:51 | 显示全部楼层
这下我想你不会忘记了.
如果一开始我告诉你答案,过阵子,你又忘了的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-3-31 08:45:10 | 显示全部楼层
回复【楼主位】volval:
-------------------------------
//IO方向设置
#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<6;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<6;}
这里设置错了.

至于哪里错了,我想你自己解决比较好.会比较深刻,下次就不会犯这种低级错误了.
 
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2011-3-31
在线时间
0 小时
 楼主| 发表于 2011-3-31 09:55:33 | 显示全部楼层
回复【2楼】正点原子:
-------------------------------
#define SDA_IN()  {GPIOB->CRL&=0XF0FFFFFF;GPIOB->CRL|=8<<7;}
#define SDA_OUT() {GPIOB->CRL&=0XF0FFFFFF;GPIOB->CRL|=3<<7;}

#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<7;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<7;}
我都改了,都没有效果。请指点
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-3-31 10:35:58 | 显示全部楼层
都不对.
GPIOB->CRL|=8<<7;
你看看改变的是什么?软件仿真看看吧!!!
一个IO口是4个位.不是1个位.看清楚点.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2011-3-31
在线时间
0 小时
 楼主| 发表于 2011-3-31 10:57:16 | 显示全部楼层
回复【4楼】正点原子:
-------------------------------
哈哈,谢谢原子大哥。
平时用它的时候都是直接赋值的。现在移位没有注意到这个问题。
正确做法是:
#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<28;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<28;}
原子的教诲让我终生难忘!
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2011-3-31
在线时间
0 小时
 楼主| 发表于 2011-3-31 15:44:33 | 显示全部楼层
回复【6楼】正点原子:
-------------------------------
原子大哥,我换了一个m24256的eeprom,里面的EE_TYPE AT24C256,也定义了。现在出现无法check成功,请问应该检测程序的哪一部分?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-3-31 15:48:00 | 显示全部楼层
已经有朋友遇到过这个问题了.
//在AT24CXX指定地址写入一个数据
//WriteAddr  :写入数据的目的地址   
//DataToWrite:要写入的数据
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{                               
    IIC_Start(); 
 if(EE_TYPE>AT24C16)
 {
  IIC_Send_Byte(0XA0);     //发送写命令
  IIC_Wait_Ack();
  IIC_Send_Byte(WriteAddr>>8);//发送高地址
  //IIC_Wait_Ack();//这里多了一个IIC_Wait_Ack();,词句需要去掉!!!  
 }else
 {
  IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //发送器件地址0XA0,写数据
 } 
 IIC_Wait_Ack();   
    IIC_Send_Byte(WriteAddr%256);   //发送低地址
 IIC_Wait_Ack();                   
 IIC_Send_Byte(DataToWrite);     //发送字节         
 IIC_Wait_Ack();           
    IIC_Stop();//产生一个停止条件
 delay_ms(10); 
}
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2011-3-31
在线时间
0 小时
 楼主| 发表于 2011-3-31 16:23:45 | 显示全部楼层
经过原子大哥的指教终于成功了。呵呵
就是将下面的
//在AT24CXX指定地址读出一个数据
//ReadAddr:开始读数的地址  
//返回值:读到的数据
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{   
u8 temp=0;          
    IIC_Start();  
if(EE_TYPE>AT24C16)
{
IIC_Send_Byte(0XA0);    //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr>>8);//发送高地址
IIC_Wait_Ack();  
}else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据   

IIC_Wait_Ack(); 
    IIC_Send_Byte(ReadAddr%256);   //发送低地址
IIC_Wait_Ack();     
IIC_Start();        
IIC_Send_Byte(0XA1);           //进入接收模式    
IIC_Wait_Ack();  
    temp=IIC_Read_Byte(0);    
    IIC_Stop();//产生一个停止条件     
return temp;
}

×××××××××××××××××××××××××××
改为
if(EE_TYPE>AT24C16)
{
IIC_Send_Byte(0XA0);     //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr>>8);//发送高地址
   
}
加上定义 EE_TYPE AT24C256
就成功了.
原子大哥太牛了.


回复 支持 反对

使用道具 举报

6

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2015-4-11
在线时间
0 小时
发表于 2015-10-26 21:23:26 | 显示全部楼层
回复【5楼】volval:
---------------------------------
如果我用PC2当作SDA  C3当作SCL  IO方向那应该怎么设置捏?我寄存器方面不怎么懂,求助。
过你就像过马路!
回复 支持 反对

使用道具 举报

6

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2015-4-11
在线时间
0 小时
发表于 2015-10-26 21:41:12 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
原子哥,GPIOB->CRL|=8<<28和GPIOB->CRL|=3<<28对于PB7是什么意思啊,那对于PC2捏?之前的我看懂了,寄存器版不怎么懂。
过你就像过马路!
回复 支持 反对

使用道具 举报

6

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2015-4-11
在线时间
0 小时
发表于 2015-10-26 21:45:10 | 显示全部楼层
回复【11楼】过你就像过马路:
---------------------------------
我找到规律了而已
过你就像过马路!
回复 支持 反对

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2015-10-27 09:10:20 | 显示全部楼层
楼主看这个帖子。包你满意。^_^
http://www.openedv.com/posts/list/61112.htm
原子哥是不是又要出黑科技了呀。^_^...
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 18:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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