关于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-21 14:16
 精彩回答 2  元偷偷看……
我爱STM_32
2楼-- · 2019-07-21 15:21
回复【8楼】正点原子:
--------------------------------- 
   找人问过了,刚测了24C512的几个SCL  和SDA都是1   是什么回事啊?能说明什么问题吗?    断点设置在AT24CXX_Read(0,datatemp,SIZE);
LCD_ShowString(20,20,200,16,16,datatemp);    这里。。。。
正点原子
3楼-- · 2019-07-21 19:00
回复【9楼】我爱STM_32:
---------------------------------
你要设置到底层,操作IO口的时候去测试,你直接一个函数过,那八成看不到变化了...
我爱STM_32
4楼-- · 2019-07-21 20:17
回复【10楼】正点原子:
---------------------------------
当IIC_SDA=1;  IIC_SCL=1;      时   ,SDA、SCL  IO口显示3.32V(量程调到20V)
当IIC_SDA=0;  IIC_SCL=0;      时   ,SDA、SCL  IO口显示0V(量程调到20V)


原子哥,测出来这样子的数据,说明是IO口没问题吗?
正点原子
5楼-- · 2019-07-22 00:11
 精彩回答 2  元偷偷看……
我爱STM_32
6楼-- · 2019-07-22 04:42
 精彩回答 2  元偷偷看……

一周热门 更多>