指令是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);
}
user5951881:
Johnsin Tao:
回复 user5951881:
Hi数字处理器芯片的问题,建议在该芯片对应的论坛交流。
KW X:
?这是ST的玩意。你让TI回答?难不成让这两家掐架不成?
建议找你的供应商吧。。。