i2c配置是按官方文档配置的,将sensorTag里面的bsp_i2c.c只能拿来用了,写是没有问题,就是读取的时候跑飞,但有试过读取成功(大部分是跑飞了),程序没变过,why why why??i2c设备是hmc5983。
hmc5983初始化如下:
int hmc5983Init() {uint8_t buf[] = {HMC5983_R_CONFIG_A, 0x70, HMC5983_R_CONFIG_B, 0xA0,};uint8_t *p_buf = buf;bspI2cSelect(BSP_I2C_INTERFACE_0, HMC5983_ADDR);for (uint8_t i = 0 ; i < 2; i++){bspI2cWrite(p_buf, 2);p_buf = p_buf + 2;} }
读取测试代码如下:
while (1){bool flag = FALSE;uint8_t write_buf[] = {HMC5983_R_MODE, 0x01};uint8_t *re_buf;uint8_t addr = 0x00;flag = bspI2cWrite(write_buf, 2);if (!flag)flag = FALSE;delay_ms(6);flag = bspI2cWriteRead(&addr, 1, re_buf, 15);if (!flag)flag = FALSE;delay_ms(67);}
每次就是在 flag = bspI2cWriteRead(&addr, 1, re_buf, 15);跑飞,求大神指点,thanks!!
xyz549040622:
这个 flag = bspI2cWriteRead(&addr, 1, re_buf, 15);的第一个参数应该是addr,不应该是&addr吧,根据经验判断,也不应该是指针类型的。
yuzhang wu:
回复 xyz549040622:
我想你是以为这个地址是设备的地址了,这个是writeData的地址,而且,要是传参错误,直接编译都不会通过。
yuzhang wu:
大神冒个泡呗
HG:
跑飞是什么意思,没有返回值还是什么?程序停下来的时候停在哪里?
你是连着蓝牙跑的还是裸跑的?
yuzhang wu:
回复 HG:
就是进去bspI2cWriteRead函数直接出不来了,暂停的时候是在红色框里,再按单步就直接在d6 d8循环跳,出不来,汇编也看不懂,求教,thanks
yuzhang wu:
回复 HG:
yuzhang wu:
回复 yuzhang wu:
冷冷清清,凄凄惨惨戚戚
xyz549040622:
回复 yuzhang wu:
看你紧接着写然后就是读,会不会没有反应过来呢?加个延时看看,或者循环等待写数据OK再读。
yuzhang wu:
回复 xyz549040622:
本来读写函数就是读写完成了才返回的,所以不存在你说的问题,我测试过了循环一直写是没问题的,就是一读就莫名其妙的不行。
yuzhang wu:
回复 HG:
纠结了这么久还是找不出原因,请问我可以怀疑是协议栈的问题么,难道我要试试裸机跑跑看?但是实际应用还是要协议栈啊,就算裸机能行也没什么意义,醉了。协议栈用的是2.1的