解决从RPI到HMCL3855L的I2C通信故障

时间:2014-01-18 21:30:46

标签: c raspberry-pi i2c

我正在尝试使用运行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;
}

2 个答案:

答案 0 :(得分:0)

我在你提供的代码中看不到任何异常,但怀疑功能bcm2835_i2c_write()。

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

答案 1 :(得分:0)

调试任何I2C设备的步骤

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

2.验证您的API是否正确地使用了从属地址,正如i2c从属设备所期望的那样,即; HMC3855L,并且在发送从属地址后验证您是否接收到ACK信号作为响应。

3.验证您是否正确配置控制寄存器。在一些i2c设备中,当它启动时,它们可能处于掉电模式,所以我们必须通过设置控制寄存器中的一些位来改变它

4.主要是读取和放大的时序图写是最重要的,更容易出错,即;注意使用启动和停止条件的位置(大多数都使用重复启动),如果您只是编写API驱动程序代码,则必须了解i2c如何读取&amp;写入内核

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

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