利用C语言编写从HP303S中通过IIC从地址为0X10-0X21的寄存器中读取校验值内容,函数名为I2C_Read_Reg8_Bytes(uint8_t ch,uint8_t addr,uint8_t reg,uint8_t *buff,uint8_t len);
时间: 2023-12-01 13:42:43 浏览: 151
以下是利用C语言编写从HP303S中通过IIC从地址为0X10-0X21的寄存器中读取校验值内容的代码,函数名为I2C_Read_Reg8_Bytes(uint8_t ch,uint8_t addr,uint8_t reg,uint8_t *buff,uint8_t len):
```c
#include "IIC.h"
#define HP303S_ADDR 0xEC // HP303S的IIC地址
// 从HP303S中读取指定寄存器的内容
uint8_t I2C_Read_Reg8_Bytes(uint8_t ch, uint8_t addr, uint8_t reg, uint8_t *buff, uint8_t len)
{
uint8_t i;
uint8_t ret = 0;
uint8_t reg_addr = reg;
uint8_t read_data[32] = {0};
// 发送IIC起始信号
IIC_Start();
// 发送IIC设备地址和写命令
IIC_Send_Byte(HP303S_ADDR << 1 | 0x00);
// 等待应答信号
if (IIC_Wait_Ack() == 0)
{
ret = 1;
goto I2C_Read_Reg8_Bytes_Exit;
}
// 发送寄存器地址
IIC_Send_Byte(reg_addr);
// 等待应答信号
if (IIC_Wait_Ack() == 0)
{
ret = 2;
goto I2C_Read_Reg8_Bytes_Exit;
}
// 发送IIC起始信号
IIC_Start();
// 发送IIC设备地址和读命令
IIC_Send_Byte(HP303S_ADDR << 1 | 0x01);
// 等待应答信号
if (IIC_Wait_Ack() == 0)
{
ret = 3;
goto I2C_Read_Reg8_Bytes_Exit;
}
// 读取数据
for (i = 0; i < len; i++)
{
if (i == len - 1)
{
read_data[i] = IIC_Read_Byte(0);
}
else
{
read_data[i] = IIC_Read_Byte(1);
}
}
// 发送IIC停止信号
IIC_Stop();
// 将读取到的数据拷贝到输出缓冲区
memcpy(buff, read_data, len);
I2C_Read_Reg8_Bytes_Exit:
return ret;
}
```
阅读全文