原子哥你好:
24cxx.c中添加
#define at24c02 1 //1-24C02 0---另一个器件,地址0X20.另外一个器件多了RESET(复位)和INTI(INTI),用51的代码读写240C02和另一个器件都可以正常读写,但是
//STM32读另一个器件,读相同的地址,每次读出数据都不一样
void IIC_Init(void) //修改为PA口
{
RCC->APB2ENR|=1<<2;//先使能外设IO PORTa时钟
GPIOA->CRL&=0XFFFF0000;//PA 0 1 2 3推挽输出
GPIOA->CRL|=0X00003333;
GPIOA->ODR|=15; //PA 0 1 2 3 输出高
}
myiic.h修改为:
#define SDA_IN() {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=8;}
#define SDA_OUT() {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=3;}
#define INTI_IN() {GPIOA->CRL&=0XFFFFF0FF;GPIOA->CRL|=8<<8;} // INTI
#define INTI_OUT() {GPIOA->CRL&=0XFFFFF0FF;GPIOA->CRL|=3<<8;} //INTI
#define IIC_SCL PAout(1) //SCL
#define IIC_SDA PAout(0) //SDA
#define READ_SDA PAin(0) //输入SDA
#define IIC_INTI PAout(2) //INTI
#define READ_INTI PAin(2) //INTI
#define IIC_CE PAout(3) //SCL
u8 AT24CXX_ReadOneByte(u16 ReadAddr) //另一个器件的I2C地址为0X20,左移后为0X40;
{ u8 ack;
u8 temp=0;
IIC_Start();
if(at24c02)
IIC_Send_Byte(0Xa0);
else
IIC_Send_Byte(0X40);
ack=IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr);
ack=IIC_Wait_Ack();
IIC_Start();
if(at24c02)
IIC_Send_Byte(0Xa1);
else
IIC_Send_Byte(0X41);
ack=IIC_Wait_Ack();
temp=IIC_Read_Byte(0);
//ack=IIC_Wait_Ack();
IIC_Stop();
return temp;
}
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite) ////另一个器件的I2C地址为0X20,左移后为0X40,读为0X41;
{ u8 ack;
IIC_Start();
if(at24c02)
IIC_Send_Byte(0Xa0);
else
IIC_Send_Byte(0X40);
ack=IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr); //发送低地址
ack=IIC_Wait_Ack();
IIC_Send_Byte(DataToWrite); //发送字节
ack=IIC_Wait_Ack();
IIC_Stop();//产生一个停止条件
delay_ms(10);
}
test.c
中修改为
int main(void)
{
u8 key,t,times=0;
u16 i=0;
u8 datatemp[SIZE];
u8 data11;
u8 data;
u8 USART_RX_BUF[64];
u8 USART_RX_STA=0;
Stm32_Clock_Init(9);//系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口1初始化
LED_Init(); //LED初始化
KEY_Init(); //按键初始化
LCD_Init(); //TFTLCD液晶初始化
AT24CXX_Init(); //IIC初始化
  OINT_COLOR=RED;//设置字体为蓝色
LCD_ShowString(60,50,"zini STM32");
LCD_ShowString(60,70,"IIC TEST");
IIC_CE=1;
delay_ms(50);
IIC_CE=0;
delay_ms(50);
IIC_CE=1;
delay_ms(50);
  OINT_COLOR=BLUE;
//IIC_INTI=1;
AT24CXX_WriteOneByte(0x20,0x20);
AT24CXX_WriteOneByte(0x21,0x22);
AT24CXX_WriteOneByte(0x22,0x24);
AT24CXX_WriteOneByte(0x23,0x26);
AT24CXX_WriteOneByte(0x24,0x28);
AT24CXX_WriteOneByte(0x25,0x2a);
data11=AT24CXX_ReadOneByte(0x20);
data=AT24CXX_ReadOneByte(0x21);
while(1)
{
data11=AT24CXX_ReadOneByte(0x20);
data=AT24CXX_ReadOneByte(0x21);
// INTI_IN();
// if(!READ_INTI) {
times++;
if(times%5000==0)
{ USART_RX_BUF[0]=AT24CXX_ReadOneByte(0x20);
USART_RX_BUF[1]=AT24CXX_ReadOneByte(0x21);
USART_RX_BUF[2]=AT24CXX_ReadOneByte(0x22);
USART_RX_BUF[3]=AT24CXX_ReadOneByte(0x23);
USART_RX_BUF[4]=AT24CXX_ReadOneByte(0x24);
USART_RX_BUF[5]=AT24CXX_ReadOneByte(0x25);
printf("\n坐标如下:\n");
printf("\n坐标1:0x %x\n",USART_RX_BUF[0]);
printf("\n坐标2:0x %x\n",USART_RX_BUF[1]);
printf("\n坐标3:0x %x\n",USART_RX_BUF[2]);
printf("\n坐标4:0x %x\n",USART_RX_BUF[3]);
printf("\n坐标5:0x %x\n",USART_RX_BUF[4]);
printf("\n坐标6:0x %x\n",USART_RX_BUF[5]);
delay_ms(10); }
}
}
//}
在while(1)
中stm32循环读0X20和0X21的数值,读写24C02正常,读另外一个器件,每次读的数值都不一样;
|