TI中文支持网
TI专业的中文技术问题搜集分享网站

我想用CC2640 的I2C总线驱动读取OPT3001 光照寄存器的值,OPT3001文档上面 0x7F 寄存器表示device ID,固定值是3001h,但是我读取到的只有30,怎么改成一次读16位的呢??

我想用CC2640  的I2C总线驱动读取OPT3001 光照寄存器的值,OPT3001文档上面 0x7F 寄存器表示device ID,固定值是3001h,但是我读取到的只有30,怎么改成一次读16位的呢??

Viki Shi:

请问你是如何读取的?建议参考一下i2ctmp例程,实现了两个字节的读取:


/* Common I2C transaction setup */i2cTransaction.writeBuf= txBuffer;i2cTransaction.writeCount = 1;i2cTransaction.readBuf= rxBuffer;i2cTransaction.readCount= 2;

user6477475:

回复 Viki Shi:

我就是这样写的,读出来是30FF,我这个不是连续读两个8位寄存器的值,是一次性读16位的寄存器的值。

YiKai Chen:

可以參考 sunmaysky.blogspot.com/…/basic-example-to-use-opt3001-on-cc2650.html

user6477475:

回复 YiKai Chen:

这个链接打不开

YiKai Chen:

回复 user6477475:

可能要用VPN

Viki Shi:

回复 user6477475:

那个链接的实现方式跟上面一样,就是先传地址,然后read count 2次读出来数据。你的低八位数据出错,是不是传输过程中出现了问题

user6477475:

回复 Viki Shi:

我试了下,还是不行,读到的还是30FF,底层驱动代码我没动的。

YiKai Chen:

回复 user6477475:

i2cTransaction.slaveAddress 有設置嗎?

user6477475:

回复 YiKai Chen:

有的,就是0x44
单步调试的时候,跟踪rxBuffer回来的数组第一个值是30,第二个值就是FF,真的是奇怪。。。是不是I2C底层读完8位后,就把总线关闭了,然后再继续读8位?还是可以连续读16位,读出来存到RxBuffer的1,2数组中?
uint8_t gSensorFxn1(UArg arg0, UArg arg1)
{/* Create I2C for usage *****************/I2C_Params_init(&params);params.bitRate = I2C_400kHz;//params.transferMode = I2C_MODE_BLOCKING;//I2C_MODE_CALLBACK;
handle = I2C_open(Board_I2C, &params);if(handle==NULL){System_printf("123");}else{System_printf("433");}Task_sleep(1000000 / Clock_tickPeriod);txBuffer[0] = 0x7F;txBuffer[1] = 0x10;txBuffer[2] = 0x00;i2cTrans.slaveAddress = 0x44;i2cTrans.writeBuf = txBuffer;i2cTrans.writeCount = 1;i2cTrans.readBuf = rxBuffer;i2cTrans.readCount = 2;I2C_transfer(handle,&i2cTrans);return 0;
}

user6477475:

回复 YiKai Chen:

这个问题困扰了好几天了,希望大佬帮忙解决下,跪谢

赞(0)
未经允许不得转载:TI中文支持网 » 我想用CC2640 的I2C总线驱动读取OPT3001 光照寄存器的值,OPT3001文档上面 0x7F 寄存器表示device ID,固定值是3001h,但是我读取到的只有30,怎么改成一次读16位的呢??
分享到: 更多 (0)