Hi,目前使用TI开发板的蓝牙芯片调试硬件I2C没有信号输出,一直没找到原因。
- 使用LAUNCHXL-CC2640R2开发板通过I2C和一个从设备通信;
- 使用STM32通过I2C和从设备读写正常,说明从设备本身没有问题;
- 使用i2ctmp007中的例程和从设备进行I2C通信正常;
问题出在将i2ctmp007中的代码迁移至SDK中的simple_peripheral例程后,始终看不到
I2C信号输出,可能是simple_peripheral例程中少添加或修改了部分代码,但我不知道少了什么。
我的步骤如下:
1. 向SDK中simple_peripheral例程drivers目录下添加i2c.c和i2c.h文件,并在main.c中添加
#include
#include "Board.h"
2. Board.h中定义
#define Board_I2C0 CC2640R2_LAUNCHXL_I2C0
#define Board_I2C_TMP Board_I2C0
3. CC2640R2_LAUNCHXL.h中定义管脚
#define CC2640R2_LAUNCHXL_I2C0_SCL0 IOID_5
#define CC2640R2_LAUNCHXL_I2C0_SDA0 IOID_15
typedef enum CC2640R2_LAUNCHXL_I2CName {
CC2640R2_LAUNCHXL_I2C0 = 0,
CC2640R2_LAUNCHXL_I2CCOUNT
} CC2640R2_LAUNCHXL_I2CName;
4. CC2640R2_LAUNCHXL.C中添加有关I2C的部分
/*
* =============================== I2C ===============================
*/
#include
#include
I2CCC26XX_Object i2cCC26xxObjects[CC2640R2_LAUNCHXL_I2CCOUNT];
const I2CCC26XX_HWAttrsV1 i2cCC26xxHWAttrs[CC2640R2_LAUNCHXL_I2CCOUNT] = {
{
.baseAddr = I2C0_BASE,
.powerMngrId = PowerCC26XX_PERIPH_I2C0,
.intNum = INT_I2C_IRQ,
.intPriority = ~0,
.swiPriority = 0,
.sdaPin = CC2640R2_LAUNCHXL_I2C0_SDA0,
.sclPin = CC2640R2_LAUNCHXL_I2C0_SCL0,
}
};
const I2C_Config I2C_config[CC2640R2_LAUNCHXL_I2CCOUNT] = {
{
.fxnTablePtr = &I2CCC26XX_fxnTable,
.object = &i2cCC26xxObjects[CC2640R2_LAUNCHXL_I2C0],
.hwAttrs = &i2cCC26xxHWAttrs[CC2640R2_LAUNCHXL_I2C0]
},
};
const uint_least8_t I2C_count = CC2640R2_LAUNCHXL_I2CCOUNT;
5. main.c中添加定义
#define TASKSTACKSIZE 640
#define TEST_ADDR 0x1A
#define MODULE_TEST_TEMP1 0x0001 /* Die Temp Result Register */
#define MODULE_TEST_TEMP2 0x0003 /* Object Temp Result Register */
#ifndef Board_TEST_ADDR
#define Board_TEST_ADDR TEST_ADDR
#endif
main.c中主函数中
/* Register Application callback to trap asserts raised in the Stack */
RegisterAssertCback(AssertHandler);
PIN_init(BoardGpioInitTable);
uint8_t txBuffer[1]={0x66};
uint8_t rxBuffer[10];
I2C_Handle i2c;
I2C_Params i2cParams;
I2C_Transaction i2cTransaction;
I2C_init();
/* Create I2C for usage */
I2C_Params_init(&i2cParams);
i2cParams.bitRate = I2C_400kHz;
i2c = I2C_open(Board_I2C_TMP, &i2cParams);
/* Point to the T ambient register and read its 2 bytes */
//txBuffer[0] = TMP007_OBJ_TEMP;
i2cTransaction.slaveAddress = (Board_TEST_ADDR>>1);
i2cTransaction.writeBuf = txBuffer;
i2cTransaction.writeCount = 1;
i2cTransaction.readBuf = NULL;
i2cTransaction.readCount = 0;
while(1)
{
I2C_transfer(i2c, &i2cTransaction);
}
请问哪里有不对的地方吗?