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.

[参考译文] CC2650STK:I2C_transfer 不起作用。

Guru**** 2558250 points
Other Parts Discussed in Thread: CC2650STK

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/572086/cc2650stk-i2c_transfer-does-not-work

器件型号:CC2650STK

我要做的是使用 sensortag 获取红外温度和湿度传感器读数。 我知道 ble SDK 中的 sensortag 源代码包含该代码。 但我需要从外部传感器(Si7006-A20-IM)读取读数。 我从 cc2650 sensortag 开始(因为 tmp007 与我需要使用的传感器的距离更近)、并尝试扩展 launchpad (simple_peripheral)的源代码、并从 tmp007读取温度传感器。  

我所做的主要是在应用程序中编辑 simple_peripheral.c。 有一个带有回调函数 simpleBLEPeripheral_taskFxn()的任务,此任务是在 SimpleBLEPeripheral_createTask()中创建的。 我同样从 main 创建了一个任务调用函数 create_MyTask()来创建任务,回调函数为 MyTask_fxn()。 我已经在 seSimpleBLEPeripheral_taskFxn()中发布了一个与 MyTask 相关的信号量,以便 BIOS 可以运行 MyTask。 任务运行正常。
接下来、我将 i2ctmp007_CC2650STK_TI_CC2650f128示例中粘贴的 I2C 代码(在 sensortag 上运行正常)复制到 MyTask 函数中。

unsigned int i;
uint16_t 温度;
uint8_t txBuffer[1];
uint8_t rxBuffer[2];
I2C_Handle i2c;
I2C_Params i2cParams;
I2C_Transaction i2cTransaction;

/*创建 I2C 以供使用*/
I2C_Params_init (&i2cParams);
i2cParams.bitrate = I2C_400kHz;
I2C = I2C_open (0、&i2cParams);
if (i2c == NULL){
MSG[7]='n';
//System_abort ("初始化 I2C\n 时出错");

否则{
//msg[7]= I2C_transfer (i2c、&i2cTransaction);
//System_printf ("I2C 已初始化!\n");


/*指向 T 环境寄存器并读取其2个字节*/
txBuffer[0]= TMP007_obj_TEMP
i2cTransaction.slaveAddress = Board_TMP007_ADDR
i2cTransaction.writeBuf = txBuffer;
i2cTransaction.writeCount = 1;
i2cTransaction.readBuf = rxBuffer;
i2cTransaction.ReadCount = 2;
MSG[9]++;
if (I2C_transfer (i2c、&i2cTransaction)){
温度= 16;
/*从接收到的数据中提取°C;请参阅 TMP102 数据表*/
温度=(rxBuffer[0]<< 6)|(rxBuffer[1]>> 2);

/*
*如果 MSB 设置为"1"、则我们有二进制补码
*需要符号扩展的负值
*
if (rxBuffer[0]& 0x80){
温度|= 0xF000;

/*
*为简单起见、将温度值除以32即可摆脱
*十进制精度;请参阅 TI 的 TMP007 数据表
*
温度/= 32;
MSG[5]=温度;
温度= 12;

//System_printf ("采样%u:%d (C)\n"、i、温度);

否则{
// System_printf ("I2C 总线故障\n");


I2C_open (0、&i2cParams)不返回 false。 但是 I2C_transfer (i2c、&i2cTransaction)不起作用。 if condition 从不执行时的代码。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否在电路板文件中将 DIO6设置为 SCL、将 DIO5设置为 SDA?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 YiKai Chen:

    这是一个很好的点... 我之前没有在板级配置文件中检查这两者。 现在、该部分板级配置文件被编辑为
    #define Board_I2C0_SDA0 ioID_5
    #define Board_I2C0_SCL0 ioID_6.

    但 I2C_transfer 仍返回 false
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    终于解决了。 情况就是这样。 我试图调用一个 swi、其中 I2C_transfer()起作用、但现在使用更改的板级配置文件将其移到了任务中。 工作正常。 谢谢 YiKai Chen。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当您调用 I2C_transfer 时、能否使用示波器检查 SCL 引脚上是否存在时钟信号?