TI工程师们以及前辈们您好:
在开发上遇上了问题,详细问题为在TI给我们的范例程式i2ctmp007中读取ADXL345 是没有问题的。可是我将I2C部份的代码移植到rfEasyLinkTx_nortos上并且加入了Timer Interrupt并在中断内读取I2C数据可是这样却没办法执行了。以下附上我的代码以及I2C讯号波形
开发环境为CCS V8,开发版为CC1310,使用I2C元件为ADXL345加速度计。
/*
* ======== rfEasyLinkTx_nortos.c ========
*/
/* Application header files */
#include "smartrf_settings/smartrf_settings.h"
/* Board Header files */
#include "Board.h"
/* Standard C Libraries */
#include <stdbool.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
/* TI Drivers */
#include <ti/drivers/pin/PINCC26XX.h>
#include <ti/drivers/Power.h>
#include <ti/drivers/rf/RF.h>
#include <ti/devices/DeviceFamily.h>
#include <ti/drivers/timer/GPTimerCC26XX.h>
/* EasyLink API Header files */
#include "easylink/EasyLink.h"
/* Driverlib APIs */
#include DeviceFamily_constructPath(driverlib/sys_ctrl.h)
/* GP Timer Callback */
void rxTimeoutCb(GPTimerCC26XX_Handle handle,
GPTimerCC26XX_IntMask interruptMask);
static volatile bool rxDoneFlag;
static volatile bool rxTimeoutFlag;
/* GPTimer handle and timeout value */
GPTimerCC26XX_Handle hTimer;
GPTimerCC26XX_Value rxTimeoutVal;
int x, timer_flag = 0;
//=i2c
#include <ti/drivers/GPIO.h>
#include <ti/drivers/I2C.h>
uint8_t txBuffer[3];
uint8_t rxBuffer[6];
I2C_Handle i2c;
I2C_Params i2cParams;
I2C_Transaction i2cTransaction;
float accel_xout,accel_yout,accel_zout;
/* Undefine to not use async mode */
#define RFEASYLINKTX_ASYNC
#define RFEASYLINKTX_BURST_SIZE 10
#define RFEASYLINKTXPAYLOAD_LENGTH 30
/* Pin driver handle */
static PIN_Handle pinHandle;
static PIN_State pinState;
PIN_Config pinTable[] = {
Board_PIN_LED1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
Board_PIN_LED2 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
#if defined __CC1352R1_LAUNCHXL_BOARD_H__
Board_DIO30_RFSW | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX,
#endif
PIN_TERMINATE
};
static uint16_t seqNumber;
#ifdef RFEASYLINKTX_ASYNC
static volatile bool txDoneFlag;
static volatile uint8_t txSleepPeriodsElapsed;
#endif //RFEASYLINKTX_ASYNC
#ifdef RFEASYLINKTX_ASYNC
void txDoneCb(EasyLink_Status status)
{
if (status == EasyLink_Status_Success)
{
/* Toggle LED1 to indicate TX */
PIN_setOutputValue(pinHandle, Board_PIN_LED1,!PIN_getOutputValue(Board_PIN_LED1));
}
else if(status == EasyLink_Status_Aborted)
{
/* Toggle LED2 to indicate command aborted */
PIN_setOutputValue(pinHandle, Board_PIN_LED2,!PIN_getOutputValue(Board_PIN_LED2));
}
else
{
/* Toggle LED1 and LED2 to indicate error */
PIN_setOutputValue(pinHandle, Board_PIN_LED1,!PIN_getOutputValue(Board_PIN_LED1));
PIN_setOutputValue(pinHandle, Board_PIN_LED2,!PIN_getOutputValue(Board_PIN_LED2));
}
txDoneFlag = true;
txSleepPeriodsElapsed = 0;
}
#endif //RFEASYLINKTX_ASYNC
void *mainThread(void *arg0)
{
uint32_t absTime;
GPIO_init();
I2C_init();
I2C_Params_init(&i2cParams);
i2cParams.bitRate = I2C_100kHz;
/* Open LED pins */
pinHandle = PIN_open(&pinState, pinTable);
if (pinHandle == NULL)
{
while(1);
}
/* Clear LED pins */
PIN_setOutputValue(pinHandle, Board_PIN_LED1, 0);
PIN_setOutputValue(pinHandle, Board_PIN_LED2, 0);
static uint8_t txBurstSize = 0;
GPTimerCC26XX_Params params;
params.width = GPT_CONFIG_32BIT;
params.mode = GPT_MODE_ONESHOT_UP;
params.debugStallMode = GPTimerCC26XX_DEBUG_STALL_OFF;
hTimer = GPTimerCC26XX_open(Board_GPTIMER0A, ¶ms);
if(hTimer == NULL)
{
while(1);
}
/* Set Timeout value to 300ms */
rxTimeoutVal = (SysCtrlClockGet()*1UL)/9UL;
GPTimerCC26XX_setLoadValue(hTimer, rxTimeoutVal);
/* Register the GPTimer interrupt */
GPTimerCC26XX_registerInterrupt(hTimer, rxTimeoutCb, GPT_INT_TIMEOUT);
GPTimerCC26XX_start(hTimer);
#ifdef RFEASYLINKTX_ASYNC
/* Reset the sleep period counter */
txSleepPeriodsElapsed = 0;
/* Set the transmission flag to its default state */
txDoneFlag = false;
#endif //RFEASYLINKTX_ASYNC
EasyLink_Params easyLink_params;
EasyLink_Params_init(&easyLink_params);
easyLink_params.ui32ModType = EasyLink_Phy_Custom;
if (EasyLink_init(&easyLink_params) != EasyLink_Status_Success){
while(1);
}
EasyLink_setRfPower(12);
while(1) {
EasyLink_TxPacket txPacket = { {0}, 0, 0, {0} };
/* Create packet with incrementing sequence number and random payload */
txPacket.payload[0] = (uint8_t)(seqNumber >> 8);
txPacket.payload[1] = (uint8_t)(seqNumber++);
uint8_t i;
for (i = 2; i < RFEASYLINKTXPAYLOAD_LENGTH; i++)
{
txPacket.payload[i] = rand();
}
txPacket.len = RFEASYLINKTXPAYLOAD_LENGTH;
txPacket.dstAddr[0] = 0xaa;
/* Add a Tx delay for > 500ms, so that the abort kicks in and brakes the burst */
if(EasyLink_getAbsTime(&absTime) != EasyLink_Status_Success)
{
// Problem getting absolute time
}
if(txBurstSize++ >= RFEASYLINKTX_BURST_SIZE)
{
/* Set Tx absolute time to current time + 1s */
txPacket.absTime = absTime + EasyLink_ms_To_RadioTime(1000);
txBurstSize = 0;
}
/* Else set the next packet in burst to Tx in 100ms */
else
{
/* Set Tx absolute time to current time + 100ms */
txPacket.absTime = absTime + EasyLink_ms_To_RadioTime(100);
}
#ifdef RFEASYLINKTX_ASYNC
/*
* Set the Transmit done flag to false, callback will set it to true
* Also set the sleep counter to 0
*/
txDoneFlag = false;
txSleepPeriodsElapsed = 0;
/* Transmit the packet */
EasyLink_transmitAsync(&txPacket, txDoneCb);
while(!txDoneFlag){
/*
* Set the device to sleep for 108ms. The packet transmission is
* set 100 ms in the future but takes about 7ms to complete and
* for the execution to hit the callback. A 1ms buffer is added to
* the sleep time to ensure the callback always execute prior to
* the end of usleep().
*/
usleep(108000);
/* check to see if the transmit flag was set during sleep */
if(!txDoneFlag){
txSleepPeriodsElapsed++;
if(txSleepPeriodsElapsed == 3){
/* 324 ms have passed. We need to abort the transmission */
if(EasyLink_abort() == EasyLink_Status_Success)
{
/*
* Abort will cause the txDoneCb to be called and the
* txDoneFlag to be set
*/
while(!txDoneFlag){};
}
break;
}
}
}
#else
EasyLink_Status result = EasyLink_transmit(&txPacket);
if (result == EasyLink_Status_Success)
{
/* Toggle LED1 to indicate TX */
PIN_setOutputValue(pinHandle, Board_PIN_LED1,!PIN_getOutputValue(Board_PIN_LED1));
}
else
{
/* Toggle LED1 and LED2 to indicate error */
PIN_setOutputValue(pinHandle, Board_PIN_LED1,!PIN_getOutputValue(Board_PIN_LED1));
PIN_setOutputValue(pinHandle, Board_PIN_LED2,!PIN_getOutputValue(Board_PIN_LED2));
}
#endif //RFEASYLINKTX_ASYNC
}
}
void rxTimeoutCb(GPTimerCC26XX_Handle handle,
GPTimerCC26XX_IntMask interruptMask)
{
timer_flag = 1;
/* Set the Timeout Flag */
rxTimeoutFlag = true;
x = x+1;
/*
* Timer is automatically stopped in one-shot mode and needs to be reset by
* loading the interval load value
*/
i2c = I2C_open(Board_I2C_TMP, &i2cParams);
txBuffer[0] = 0x32;
txBuffer[1] = 0xa7;
i2cTransaction.slaveAddress = 0x53;
i2cTransaction.writeBuf = txBuffer;
i2cTransaction.writeCount = 2;
i2cTransaction.readBuf = rxBuffer;
i2cTransaction.readCount = 6;
if (I2C_transfer(i2c, &i2cTransaction))
{
accel_xout = (((rxBuffer[0] + (rxBuffer[1]<<8)))*0.00001526);
accel_yout = (((rxBuffer[2] + (rxBuffer[3]<<8)))*0.00001526);
accel_zout = (((rxBuffer[4] + (rxBuffer[5]<<8)))*0.00001526);
}
I2C_close(i2c);
GPTimerCC26XX_setLoadValue(hTimer, rxTimeoutVal);
timer_flag = 0;
if(timer_flag == 0) GPTimerCC26XX_start(hTimer);
}
