代码之家  ›  专栏  ›  技术社区  ›  Daniel Barvík

使用I2C\U主库AVR

  •  0
  • Daniel Barvík  · 技术社区  · 6 年前

    我正在为AVR使用I2C\U主库,通信工作正常,但我没有什么问题,如何获取数据。

    我正在使用此功能

    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)

    1 回复  |  直到 6 年前
        1
  •  0
  •   K. Koovalsky    6 年前

    功能 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 必须大于或等于 论点

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

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