使用 I2C_master 库 AVR

Using I2C_master library AVR

我正在为 AVR 使用 I2C_master 库,通信工作正常,但我有一点问题,如何获取数据。

我正在使用这个功能

uint16_t i2c_2byte_readReg(uint8_t devaddr, uint16_t regaddr, uint8_t* data, uint16_t length){

devaddr += 1;
if (i2c_start(devaddr<<1|0)) return 1;

i2c_write(regaddr >> 8);
i2c_write(regaddr & 0xFF);

if (i2c_start(devaddr<<1| 1)) return 1;

for (uint16_t i = 0; i < (length-1); i++)
{
    data[i] = i2c_read_ack();
}
data[(length-1)] = i2c_read_nack();

i2c_stop();

return 0;}

现在我需要使用接收到的数据,通过UART发送给PC

    uint8_t* DevId;

    i2c_2byte_readReg(address,REVISION_CODE_DEVID,DevId,2);
    deviceH=*DevId++;
    deviceL=*DevId; 
    UART_send(deviceH); 
    UART_send(deviceL); 

我觉得我迷路了。你能帮我吗,我怎样才能得到接收到的数据以备将来使用? (在这种情况下,UART 对我来说工作正常,但它只发送 0x00 和这个代码)

函数i2c_2byte_readReg将第三个参数作为指向数据写入缓冲区的指针。请注意,它的大小必须大于名为 length 的第四个参数。您的 DevId 指针未指向任何缓冲区,因此在调用该函数时您遇到了访问冲突。

要获取数据,您应该在调用函数之前定义一个数组:

const size_t size = 8;
uint8_t data[size];

然后你可以调用将缓冲区地址作为参数传递的函数(数组名称转换为它的地址):

const uin16_t length = 2;    
i2c_2byte_readReg(address, REVISION_CODE_DEVID, data, length);

假设函数运行良好,这两个字节将被保存到 data 缓冲区中。请记住 size 必须大于或等于 length 参数。

然后您可以通过 UART 发送数据:

UART_send(data[0]); 
UART_send(data[1]);