This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/LAUNCHXL-CC2650:ADXL345 - I2C 事务存在一些问题

Guru**** 2587365 points
Other Parts Discussed in Thread: CC2650

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/598347/rtos-launchxl-cc2650-adxl345---some-problem-with-i2c-transaction

器件型号:LAUNCHXL-CC2650
Thread 中讨论的其他器件:CC2650

工具/软件:TI-RTOS

大家好、

我遇到的问题与本文(https://e2e.ti.com/support/embedded/tirtos/f/355/t/538836)非常相似、只不过我使用的是 CC2650通过 I2C 接口与 ADXL345连接。 我的第一个读/写事务始终失败、我必须发送虚拟事务作为变通方法。 在我的第一个事务之后、 写入/读取寄存器的其他事务将正常工作。  遗憾的是、该帖子很旧、因此我不知道 OP 是否找到解决方案。 是否有人遇到相同的问题或知道导致此问题的原因?

我运行了几个测试来确保我的 CC2650和 ADXL345能够正常通信、包括"重新读取"事务以获取器件 ID、并返回0xE5的值(如数据表中所述正确)。

此时、我将尝试找到上述解决方案、并实现一个函数来读取3轴 x、y、z 的原始输入数据并 将其转换为 g、

void ADXL345_GetGxyz (float* x、
float* y、
float* z)
{
system_printf ("\t%s 被调用\n"、__function__);System_flush ();
无符号短整型 xData = 0;// X 轴的输出数据。
unsigned short yData = 0;// Y 轴的输出数据。
unsigned short zData = 0;// Z 轴的输出数据。

ADXL345_GetXyz (&xData、&yData、&zData);
*x =(浮点)(fullResolutionSet? (xData * ADXL345_scale_factor):
(xData * ADXL345_scale_factor *(selectedRange >> 1)));
*y=(Float)(FullResolutionSet? (yData * ADXL345_scale_factor):
(yData * ADXL345_scale_factor *(selectedRange >> 1)));
*z =(浮点)(fullResolutionSet? (zData * ADXL345_scale_factor):
(zData * ADXL345_scale_factor *(selectedRange >> 1)));
}

void ADXL345_GetXyz (unsigned short* x、
unsigned short* y、
unsigned short* z)
{
system_printf ("\t%s 被调用\n"、__function__);System_flush ();
*x = ADXL345_GetRegisterValue (ADXL345_DATAX1)<<8;
*x += ADXL345_GetRegisterValue (ADXL345_DATAX0);
* y = ADXL345_GetRegisterValue (ADXL345_DATAY1)<< 8;
*y += ADXL345_GetRegisterValue (ADXL345_DATAY0);
*z = ADXL345_GetRegisterValue (ADXL345_DATAZ1)<<8;
*z += ADXL345_GetRegisterValue (ADXL345_DATAZ0);
}

uint32_t ADXL345_GetRegisterValue (uint32_t registerAddress)
{
system_printf ("\t%s 被调用\n"、__function__);System_flush ();
uint32_t ReadData[2]={0};
uint32_t writeData[2]={0};
uint32_t 寄存器值= 0;

I2C_Transaction i2cTransaction;
//设置事务
writeData[0]=寄存器地址;
i2cTransaction.slaveAddress = ADXL345_address;
i2cTransaction.writeBuf = writeData;
i2cTransaction.writeCount = 1;
i2cTransaction.readBuf = ReadData;
i2cTransaction.ReadCount = 1;

if (I2C_transfer (i2c、&i2cTransaction)){
registerValue = ReadData[0];
System_printf ("我们从 ACC 收到了这个1字节:%04x\n"、registerValue);System_flush ();
System_printf ("读取工作\n");System_flush ();
} 否则{
System_printf ("I2C 总线故障....。 读取寄存器函数\n");
system_flush();
}
返回寄存器值

;} 

但是、调用 ADXL_GetGxyz 时、我只能得到与 X Y Z 相同的值:c083 9d8b 1759、尽管我尝试用不同的位置移动加速计? 我可能出了什么问题?

如果有任何帮助,将不胜感激。 谢谢、

Henry

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我读过一篇文章、说要读取寄存器、需要通过两次 I2C 传输来完成。 第1次传输是"写入"、用于指定寄存器地址。 第2个位从寄存器中读取。

    以下交易是否会处理2次传输?

    I2C_Transaction i2cTransaction;
    
    //设置事务
    writeData[0]= registerAddress;
    i2cTransaction。slaveAddress = ADXL345_address;
    i2cTransaction。writeBuf = writeData;
    i2cTransaction。writeCount = 1;
    i2cTransaction。readBuf = ReadData;
    i2cTransaction.ReadCount = 1;
    
    I2C_transfer (i2c、&i2cTransaction) 

    谢谢、

    Henry

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    请参阅下面这篇文章中的 I2C 测试代码。 它被设置为读取 I2C LIS3DH 加速计的器件标识寄存器。

    e2e.ti.com/.../586492

    -克尔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Markel、您好!

    感谢分享、但您的代码与我的代码非常相似、如果不相同的话。

    我能够发送一个读取事务并获取 I2C adxl345加速计的器件 ID 寄存器、但出于某种原因、我的程序中的第一个事务始终为 false。
    更重要的是、我正在尝试了解如何正确读取加速计 adxl345、而我的 ADXL345_Getxyz 似乎没有获得正确的结果。

    谢谢、
    Henry
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    为了进一步测试、我确定虽然我可以成功执行读取事务、但我的写入事务不会更改寄存器值。

    我尝试将功率控制模式设置为测量(0x1)而不是待机(0x0)、但在写入事务之前和之后 POWER_CTL 寄存器的值都保持为0x0。 有人知道如何解决这个问题吗?

    谢谢、
    Henry
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    第一个传输问题可能与此问题 e2e.ti.com/.../564068有关