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.

[参考译文] CC2640R2F:CC2640r2f

Guru**** 2782575 points

Other Parts Discussed in Thread: TMP102

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/691791/cc2640r2f-cc2640r2f

器件型号:CC2640R2F
主题中讨论的其他器件:TMP102

尊敬的先生:

我尝试使用 I2C 连接 EEPROM IC 24C16A。  

我从 EEPROM 读取 FF。 请检查我的代码并提出建议。

/*
*版权所有(c) 2016-2017、德州仪器(TI)公司
*保留所有权利。
*
*以源代码和二进制形式重新分发和使用、有无
*如果满足以下条件、则允许进行修改
符合*:
*
**源代码的重新分发必须保留上述版权
*注意、此条件列表和以下免责声明。
*
**二进制形式的再发行必须复制上述版权
*请注意、中的此条件列表和以下免责声明
*随分发提供的文档和/或其他材料。
*
**德州仪器公司的名称和名称均不相同
*其贡献者可用于认可或推广衍生产品
*未经特定的事先书面许可。
*
*本软件由版权所有者和贡献者"按原样"提供
*以及任何明示或暗示的保证、包括但不限于:
*特定适销性和适用性的隐含保证
*不承认目的。 在任何情况下、版权所有者不得或
*派遣国应对任何直接、间接、偶然、特殊、
*典型或必然的损害(包括但不限于
*采购替代货物或服务;丧失使用、数据或利润;
*或业务中断)、无论原因是什么以及任何责任理论、
*无论是合同、严格责任还是侵权行为(包括疏忽或)
*否则)因使用本软件而以任何方式产生、
*即使被告知可能会发生此类损坏。
*

/*
*==== i2ctmp007.c ===
*
#include
#include
#include

/*驱动程序头文件*/
#include
#include
#include

/*示例/板头文件*/
#include "Board.h"

#define TASKSTACKSIZE 640

#define TMP007_DIE_TEMP 0x01 //0x0000 /*裸片温度结果寄存器*
#define TMP007_obj_TEMP 0x0003 //对象温度结果寄存器*/

静态 Display_Handle 显示;

/*
*==== mainThread ====
*
void * mainThread (void * arg0)

unsigned int i;
uint8_t EEDATA0;
uint8_t EEDATA1;
uint8_t txBuffer1[1];
uint8_t txBuffer2[1];
uint8_t txBuffer3[1];
uint8_t rxBuffer[2];
I2C_Handle i2c;
I2C_Params i2cParams;
I2C_Transaction i2cTransaction;

/*调用驱动程序初始化函数*/
display_init();
GPIO_init();
I2C_init();

/*打开主机显示屏以输出*/
Display = Display_open (Display_Type_UART、NULL);
if (display =NULL){
while (1);

/*打开用户 LED */
GPIO_WRITE (Board_GPIO_LED0、Board_GPIO_LED_ON);
display_printf (display、0、0、"启动 i2ctmp007示例\n");


/*创建 I2C 以供使用*/
I2C_Params_init (&i2cParams);
// i2cParams.bitrate = I2C_400kHz;
I2C = I2C_open (Board_I2C_TMP、&i2cParams);
if (i2c == NULL)

Display_printf (display、0、0、"Error Initializing I2C\n");
while (1);

其他

display_printf (display、0、0、"I2C initialized!\n"\});

///--------------------------------------------

/*指向 T 环境寄存器并读取其2个字节*/
// txBuffer[0]= 0xA0;//EEPROM 器件地址+写入
// txBuffer[1]= 0xA0;
TxBuffer1[0]= 0x55;//EEPROM 字地址
TxBuffer2[0]= 0xAA;//EEPROM 数据
TxBuffer3[0]= 0xA1;//EEPROM 器件地址+读取

/*采集20个样本并将其打印到控制台*/
while (1){
i2cTransaction.slaveAddress = 0xA0;
usleep(2);
i2cTransaction.writeBuf = txBuffer1;
usleep(2);
i2cTransaction.writeBuf = txBuffer2;
usleep(2);
i2cTransaction.writeBuf = txBuffer3;//
i2cTransaction.writeCount = 1;
usleep(2);

i2cTransaction.readBuf = rxBuffer;
i2cTransaction.ReadCount = 1;


I2C_transfer (i2c、&i2cTransaction);
// if (I2C_transfer (i2c、&i2cTransaction))
//{
/*从接收到的数据中提取°C;请参阅 TMP102数据表*/
//温度=(rxBuffer[0]<< 6)|(rxBuffer[1]>> 2);

/*
*如果 MSB 设置为"1"、则我们有二进制补码
*需要符号扩展的负值
*
// if (rxBuffer[0]& 0x80){
//温度|= 0xF000;
//}
/*
*为简单起见、将温度值除以32即可摆脱
*十进制精度;请参阅 TI 的 TMP007数据表
*
//温度/= 32;


EEDATA0 = rxBuffer[0];
EEDATA1 = rxBuffer[1];
Display_printf (display、0、0、"Sample %u:%d \n"、i、EEDATA0);
Display_printf (display、0、0、"Sample %u:%d \n"、i、EEDATA1);
//}
//否则{
// Display_printf (display、0、0、"I2C Bus fault\n");
//}

/*睡眠1秒*/
睡眠(2);
}//end while1


/*已取消初始化 I2C */
I2C_Close (i2c);
display_printf (display、0、0、"I2C closed!\n"\});

返回(空);


}//end main

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

    我不熟悉24C16A、因此我不知道它需要什么数据、但您对代码所做的是将1个字节(txBuffer3)传输到地址0xA0 (i2cTransaction.slaveAddress)、然后读取一个字节(ReadCount = 1)。 即使将 ReadCount 设置为1、也会选中 rxBuffer[0]和 rxBuffer[1]。

    不确定您尝试使用以下代码执行的操作:

    i2cTransaction.slaveAddress = 0xA0;
    usleep(2);
    i2cTransaction.writeBuf = txBuffer1;
    usleep(2);
    i2cTransaction.writeBuf = txBuffer2;
    usleep(2);
    i2cTransaction.writeBuf = txBuffer3;//
    i2cTransaction.writeCount = 1;
    usleep(2);

    在您调用以下命令之前、不会通过 I2C 发送任何内容:

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

    尊敬的先生:

    感谢你的答复。

    我正在尝试在 EEPROM IC 上写入数据并从 EEPROM 读回。

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

    我明白了。 我想知道您实际上尝试通过 I2C 传输哪些数据。

    将 writeBuf 设置为3个不同的值(txBuffer1、txBuffer2和 txBuffer3)。

    i2cTransaction.slaveAddress = 0xA0;

    usleep(2);

    i2cTransaction.writeBuf = txBuffer1

    usleep(2);

    i2cTransaction.writeBuf = txBuffer2

    usleep(2);

    i2cTransaction.writeBuf = txBuffer3;//

    i2cTransaction.writeCount = 1;

    usleep(2);

    在调用以下命令之前、不会通过 I2C 发送任何内容:

    I2C_transfer (i2c、&i2cTransaction);

    然后发送的是 txBuffer3至地址0xA0。

    这是您想要做的吗?

    如果是、您也可以执行以下操作:

    i2cTransaction.slaveAddress = 0xA0;

    i2cTransaction.writeBuf = txBuffer3;

    i2cTransaction.writeCount = 1;

    I2C_transfer (i2c、&i2cTransaction);

    如果要向地址0xA0发送3个字节、应执行以下操作:

    uint8_t txBuffer[]={0x55、0xAA、0xA1};

    i2cTransaction.slaveAddress = 0xA0;

    i2cTransaction.writeBuf = txBuffer;

    i2cTransaction.writeCount = 3;

    I2C_transfer (i2c、&i2cTransaction);

    Siri