我正在尝试使用运行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;
}
答案 0 :(得分:0)
我在你提供的代码中看不到任何异常,但怀疑功能bcm2835_i2c_write()。
延迟量也可能导致问题。 设置从机地址后,您没有提供任何延迟,导致问题。
答案 1 :(得分:0)
调试任何I2C设备的步骤
1.验证您的硬件连接是否正常(尤其是SCL和SDA)
2.验证您的API是否正确地使用了从属地址,正如i2c从属设备所期望的那样,即; HMC3855L,并且在发送从属地址后验证您是否接收到ACK信号作为响应。
3.验证您是否正确配置控制寄存器。在一些i2c设备中,当它启动时,它们可能处于掉电模式,所以我们必须通过设置控制寄存器中的一些位来改变它
4.主要是读取和放大的时序图写是最重要的,更容易出错,即;注意使用启动和停止条件的位置(大多数都使用重复启动),如果您只是编写API驱动程序代码,则必须了解i2c如何读取&amp;写入内核
5.数据转换可能需要一些时间,因此请检查数据表电气特性部分中的信息
考虑所有这些信息,我希望你能够解决问题