繁体   English   中英

对从RPI到HMCL3855L的I2C通信进行故障排除

[英]Troubleshooting I2C communication from RPI to HMCL3855L

我试图弄清楚如何使用运行Arch linux的Raspberry Pi与HMC3855L指南针模块进行通信。

目前,我已经建立了所有连接,并且可以使用unix工具i2cdetect看到设备地址(0x1E),但是每当我尝试运行代码时,我一无所获。 我正在使用Mike McCauley的Bcm2835库进行C编程。

我对使用C语言进行编程还很陌生,但是我只需要快速又脏的东西来读取一些东西。 我检查并确保所有数组都包含正确的值,并且指针指向正确的地址。 每次我运行脚本并再次检查i2cdetect时,地址都从(0x1E)变为(0x03),这很奇怪。 任何有关此事的建议将不胜感激。 代码如下...

/* i2ccompass:
* Test script for continuously reading data from i2c compass
* device and logging to a file.
*
*/

#include <bcm2835.h>
#include <stdio.h>

uint16_t clk_div = BCM2835_I2C_CLOCK_DIVIDER_148;
uint8_t slave_address = 0x1E;
uint64_t delay = 70000;

int main(void) {

    if (!bcm2835_init()) return 1;
    bcm2835_i2c_begin();
    bcm2835_i2c_setSlaveAddress(slave_address);

    printf("Clock divider set to: %d\n", clk_div);
    printf("Slave address set to: %d or %X\n",slave_address,slave_address);

    char writeBuff[3] = {0x3C,0x00,0x70};
    char gainBuff[3] = {0x3C,0x01,0xA0};
    char modeBuff[3] = {0x3C,0x02,0x00};
    char startTransBuff[2] = {0x3D,0x06};
    char repeat[2] = {0x3C,0x03};
    char readBuff[10];

    char *wb_ptr, *gb_ptr, *mb_ptr,
          *stb_ptr, *r_ptr, *re_ptr;
    wb_ptr = writeBuff;
    gb_ptr = gainBuff;
    mb_ptr = modeBuff;
    stb_ptr = startTransBuff;
    r_ptr = readBuff;
    re_ptr = repeat;

    bcm2835_i2c_write(wb_ptr, 3);
    bcm2835_delayMicroseconds(delay);
    bcm2835_i2c_write(gb_ptr, 3);
    bcm2835_delayMicroseconds(delay);
    bcm2835_i2c_write(mb_ptr, 3);
    bcm2835_delayMicroseconds(delay);
    bcm2835_i2c_write(stb_ptr, 2);

    bcm2835_delayMicroseconds(delay);

    bcm2835_i2c_read(r_ptr, 6);
    int i = 1;
    for(i; i <= 10; i++){
     printf("Read Buf[%d] = %x or %d\n",
          i-1, readBuff[i-1], readBuff[i-1]);
    }
    bcm2835_delayMicroseconds(delay);

    bcm2835_i2c_write(re_ptr, 2);

    bcm2835_i2c_end();
    bcm2835_close();
    printf("... done\n");
        return 0;
}

我没有看到您提供的代码中有任何异常,但怀疑函数bcm2835_i2c_write()。

延迟量也可能导致问题。 设置从站地址可能导致问题后,您没有提供任何延迟。

调试任何I2C设备的步骤

1.验证您的硬件连接是否正常(尤其是SCL和SDA)

2.验证您的API是否按照i2c从站(HMC3855L)的预期正确使用了从站地址,并在发送从站地址后验证您正在接收ACK信号作为响应。

3.验证您是否正确配置了控制寄存器。 在某些i2c设备最初启动时,它们可能处于掉电模式,因此我们必须通过在控制寄存器中设置一些位来对其进行更改

4,读写时序图主要是最重要的,更容易出错。 请注意在哪里使用了开始和停止条件(其中大多数使用重复开始), 如果您只是在编写API驱动程序代码,则必须了解i2c读写在内核中的工作方式

5.数据转换可能需要一些时间,因此请检查数据表电气特性部分中的信息

考虑到所有这些信息,我希望您能够解决问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM