关于IIC通讯的问题,原子哥帮我看一下吧!!

2019-07-21 00:22发布

 STM32的PC1(引脚9)接AT24C512的SDA(引脚5)、        STM32的PC2(引脚10)接AT24C512的SCL(引脚6)、    
 STM32的PA9(引脚42)接AT24C512的SDA(引脚5)、        STM32的PA10(引脚43)接AT24C512的SCL(引脚6)、 

我的IIC初始化为:
//初始化IIC
void IIC_Init(void)
{         
  RCC->APB2ENR|=1<<4;//先使能外设IO PORTC时钟        
 GPIOC->CRL&=0XFFFFF00F;//PC1、PC2 推挽输出
 GPIOC->CRL|=0X00000330;   
 GPIOC->ODR|=1<<1;     //PC1输出高
 GPIOC->ODR|=1<<2;     //PC2输出高  RCC->APB2ENR|=1<<2;       //PORTA时钟使能
 GPIOA->CRH&=0XFFFFF00F;
 GPIOA->CRH|=0X00000330; //PA9、10推挽输出
 GPIOA->ODR|=1<<9;  //PA9输出高   
 GPIOA->ODR|=1<<10;  //PA10输出高
}


//IO方向设置
//#define SDA_IN()  {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;}
//#define SDA_OUT() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=3<<12;}
#define SDA_IN()  {GPIOC->CRL&=0XFFFFFF0F;GPIOC->CRL|=0X00000080; }
#define SDA_OUT() {GPIOC->CRL&=0XFFFFFF0F;GPIOC->CRL|=0X00000030; }
//IO操作函数 
#define IIC_SCL    PCout(2) //SCL
#define IIC_SDA    PCout(1) //SDA 
#define READ_SDA   PCin(1)  //输入SDA

读:
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{     
 u8 temp=0;                         
    IIC_Start(); 
 if(EE_TYPE>AT24C16)
 {
  IIC_Send_Byte(0XA2);    //发送写命令
  IIC_Wait_Ack();
  IIC_Send_Byte(ReadAddr>>8);//发送高地址
  IIC_Wait_Ack();  
 }
 else
  IIC_Send_Byte(0XA2+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据    IIC_Wait_Ack();
     IIC_Send_Byte(ReadAddr%256);   //发送低地址
 IIC_Wait_Ack();    
 IIC_Start();       
 IIC_Send_Byte(0XA3);           //进入接收模式     
 IIC_Wait_Ack(); 
    temp=IIC_Read_Byte(0);    
    IIC_Stop();//产生一个停止条件    
 return temp;
}


写:
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{                               
    IIC_Start(); 
 if(EE_TYPE>AT24C16)
  {
   IIC_Send_Byte(0XA2);     //发送写命令
   IIC_Wait_Ack();    //等待信号的到来
   IIC_Send_Byte(WriteAddr>>8);//发送高地址  
  }
 else
   IIC_Send_Byte(0XA2+((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); 
}



主函数:
const u8 TEXT_Buffer[]={"WarShipSTM32 IIC TEST"};
#define SIZE sizeof(TEXT_Buffer)  
 u8 datatemp[SIZE];
AT24CXX_Write(0, (u8*)TEXT_Buffer,SIZE);
 AT24CXX_Read(0,datatemp,SIZE);
 //LCD_ShowChar(20, 20,datatemp[0], 12, 0);
 LCD_ShowString(20,20,200,16,16,datatemp);




就是读不出来。。。。   不知道哪里做错了,原子哥帮我看看哪里有问题,谢谢!!


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
33条回答
正点原子
1楼-- · 2019-07-23 14:17
回复【25楼】我爱STM_32:
---------------------------------
你那个0.67V,表示不知道怎么来的,还有SCL为1.27V,也不正常。
你看看寄存器状态吧,如果寄存器状态正常,说明就是你的代码问题了(可以排除GPIO的设置问题了,检查功能上的问题)
我爱STM_32
2楼-- · 2019-07-23 16:52
回复【26楼】正点原子:
---------------------------------
你看看寄存器状态吧,如果寄存器状态正常,说明就是你的代码问题了


这句话如何理解啊?不是很明白。。
我爱STM_32
3楼-- · 2019-07-23 22:07
 精彩回答 2  元偷偷看……
我爱STM_32
4楼-- · 2019-07-24 02:32
回复【26楼】正点原子:
---------------------------------
原子哥  ,,  我的这个AT24C512是不是坏了。。。。
正点原子
5楼-- · 2019-07-24 06:32
 精彩回答 2  元偷偷看……
我爱STM_32
6楼-- · 2019-07-24 09:25
回复【30楼】正点原子:
---------------------------------
估计是AT24C512坏了。。。。

一周热门 更多>