关于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 03:05
回复【20楼】正点原子:
---------------------------------
那就奇怪了,为什么
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电压突然少了一半,即为:0.67V左右。。。。      SCL为1.27V正常              
这里的问题 ,  说明是硬件的问题?还是 软件的问题啊? 

一周热门 更多>