指令是0x09。为什么不能返回信息
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void IIC_Send_Byte(u8 txd)
{
u8 t;
I2C_SDA_OUT();
I2C_SCL_L;//拉低时钟开始数据传输
for(t=0;t<8;t++)
{
if((txd&0x01)>0) //0x80 1000 0000
I2C_SDA_H;
else
I2C_SDA_L;
txd>>=1; //把要发送的数据左移一位,方便下次处理次高位
Delay(1);
I2C_SCL_H;
Delay(1);
I2C_SCL_L;
Delay(1);
}
}
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
I2C_SDA_IN();//SDA设置为输入
for(i=0;i<8;i++ )
{
I2C_SCL_L;
Delay(1);
I2C_SCL_H;//SCL上升沿的时候开始读取数据
receive<<=1;
if(GPIO_ReadInputDataBit(GPIO_I2C,I2C_SDA))
receive++;
Delay(1);
}
if (ack==0)
IIC_NAck();//发送nACK
else
IIC_Ack(); //发送ACK
return receive;
}
uint8_t GetCrc8(unsigned char * data, int length)
{
uint8_t crc = 0;
int i, j;
for( i = 0; i < length; i ++ )
{
crc ^= data[i];
for(j = 0; j < 8; j ++)
{
crc = (crc & 0x80) ? ((uint8_t)((crc << 1) ^ 0x07)) : (crc <<= 1);
}
}
return crc;
}
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{
u8 i,temp=0;
u8 RData[2];
IIC_Start();
IIC_Send_Byte(0x16); //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr); //发送低地址
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(0x17); //进入接收模式
IIC_Wait_Ack();
for(i=0;i<2;i++)
{
RData[i]=IIC_Read_Byte(0) ;
}
//crc= GetCrc8(chekbuf, 5);
temp=(RData[1]<<8)|RData[0];
IIC_Stop();//产生一个停止条件
return temp;
}
//在AT24CXX指定地址写入一个数据
//WriteAddr :写入数据的目的地址
//DataToWrite:要写入的数据
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{
IIC_Start();
IIC_Send_Byte(0XA0); //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr); //发送低地址
IIC_Wait_Ack();
IIC_Send_Byte(DataToWrite); //发送字节
IIC_Wait_Ack();
// IIC_Send_Byte(DataToWrite%256); //发送字节
// IIC_Send_Byte(DataToWrite/256);
IIC_Send_Byte(DataToWrite);
IIC_Wait_Ack();
IIC_Stop();//产生一个停止条件
Delay(10);
}
void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)
{
u8 i;
unsigned char CRC_data=0;
for(i=0,i<NumToRead,i++)
{
*pBuffer++=AT24CXX_ReadOneByte(ReadAddr+i);
}
CRC_data=AT24CXX_ReadOneByte(ReadAddr+i);
if(GetCrc8(ReadAddr,NumToRead)==CRC_data)
return pBuffer;
}
//在AT24CXX里面的指定地址开始写入指定个数的数据
//WriteAddr :开始写入的地址 对24c02为0~255
//pBuffer :数据数组首地址
//NumToWrite:要写入数据的个数
void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
{
u8 i;
unsigned char CRC_data=0x00;
CRC_data=GetCrc8(pBuffer,NumToWrite);
for(i=0,i<NumToWrite,i++)
{
AT24CXX_WriteOneByte(WriteAddr+i,(*(pBuffer+i)));
}
AT24CXX_WriteOneByte(WriteAddr+NumToWrite,CRC_data);
}
Johnsin Tao:
Hi数字处理器芯片的问题,建议你在对应芯片的板块交流。