TI中文支持网
TI专业的中文技术问题搜集分享网站

stm32F407利用smbus读取电池板护板读取到的电池电压值

指令是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数字处理器芯片的问题,建议你在对应芯片的板块交流。

赞(0)
未经允许不得转载:TI中文支持网 » stm32F407利用smbus读取电池板护板读取到的电池电压值
分享到: 更多 (0)