关于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条回答
我爱STM_32
2019-07-23 11:03
回复【24楼】正点原子:
---------------------------------
原子哥,你误会我意思了。。。我就把断点设置在
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)  
{  
error=1;  
IIC_Stop();  
return 1;  
}  
}  
IIC_SCL=0;//时钟输出0       
return 0;    
}   

断点在while(READ_SDA) 这里。。。然后去测SDA、SCL的电压。。   测出来是SDA为0.67V。。。      SCL为1.27V正常 

再单步运行,程序没有跳进去while(READ_SDA)里(说明接收是成功的)。。。。。可问题就是既然接收成功了,那么读出来就应该是0x21才对的。。
在主函数里,读出来的却是0x00.。。   这又说明了什么问题啊?原子哥

一周热门 更多>