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);
就是读不出来。。。。 不知道哪里做错了,原子哥帮我看看哪里有问题,谢谢!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
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;
}
把 if(EE_TYPE>AT24C16) 里面的那个 IIC_Wait_Ack(); 注释掉试试,我的AT24C32也是读不出来,注释掉就好了
一周热门 更多>