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 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正常
这里的问题 , 说明是硬件的问题?还是 软件的问题啊?
---------------------------------
STM32停止了么?没有在WHILE里面循环跑吧? 停止了电话,看看寄存器状态。
---------------------------------
原子哥,你误会我意思了。。。我就把断点设置在
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.。。 这又说明了什么问题啊?原子哥
一周热门 更多>