主题中讨论的其他部件: Z-stack, PCA9534A, PCA9534,
工具/软件:TI-RTOS
您好,
我使用的是一个自定义板,其中包含运行 Z-Stack 1.2 .2a (BIOS_6_41_02_41 ,driverlib cc26xxware_2_20_06_1.4829万, xdctools_3_30_06_67)的CC2650MODA模块。 我正在尝试与TI PCA9534A 8位I2C IO扩展器通信。 我的自定义PCA9534设备驱动程序使用 分别位于\tirtos_simplelink_2_11_01_09\packages\ti\boards\SensorTag\Interfaces的BSP-stack演示代码随附的传感器软件模块实现。sensor.h/.c只是 BSP_i2c.
只要我在任务上下文中调用通信函数,只要我尝试读取Hwi/Swi上下文readIOs()中的寄存器返回FALSE,通信就会完美运行。 在PCA9534初始化过程中动态配置Hwi。 连接到CC2650MODA模块的PCA8534中断引脚触发Hwi上下文中的寄存器读取。 一旦PCA9534驱动一个下降边缘 GPIO _InterruptISR(...)被调用,但 sensorReadReg (...) (它只是 bspI2cWriteRead()的包装程序,总是返回false。
我已经检查了I2C帧是否按应有的方式发送/接收,物理通信在I2C上显示了针对HWI/Swi的呼叫和任务上下文中的频繁呼叫的正确请求/响应帧。 因此,该问题必须位于TI-RTOS上下文中的某个位置
BTW.: IAR嵌入式工作台IDE ARM 7.70 v.2。
#include "BSP_i2c.h"
#include "sensor.h"
#include "Board.h"
#include <stddef.h>
#include <ti/SysBIOS/family/arm/m3/HWi.h>
#include <xDC/cfg/Gall.h>
#include <ti/drivers/pin/pinfi-----
--><x/!---->---
----------------------------------------------------------------------------------------------------------------------------------------------------------
* 常量
*----------------------------------
*/
/*从属地址*/
#define device_I2C_address 0x38
/*注册地址*/
#define REG_INPUT 0x00
#define REG_OUTPUT 0x01
#define REG_POL_INFTPUT 0x02
#define REG_CONFIGURATION 0x03
#define REG_LENG_LENGTH 0x01 //注册长度
#define DEVICE_SELECT() bspI2cSelect(BSP_I2C_interface_0,device_I2C_address)
#define device_Deselect () bspI2cDeselect()
static uint8_t gIoConfig =0;
static uint8_t gInputRegVal = 0x00;
static bool gInit = false;
/*中断引脚*/
PIN_handle interruptPinHandle;
static PIN_State interState;
static PIN_Config interruptPinTable[]=
{
Board_InterrupT_In | PIN_INPUT_EN | PIN_NOPULL | PIN_IRQ_NEGEDGE | PIN_hysteresis,//扩展器中断引脚
PIN_TERMINATE /* TERMINATE列表*/
};/*
----------------------------------
* 本地函数
*----------------------------------
*/*----------------------------------
* 公共职能
*----------------------------------
*/
// hwi
void gPIO_InterruptISR(PIN_handle interruptPinHandle, PIN_ID interruptPinId){Swi_post(swiExpanderInterrupt);}//
Swi
void interruptStatusSwi(){uint8_t
readVal =0;
if(!readIOs(&readV))){
//我们返回:/
返回;}
//一些要做的事情
}//
初始化
bool setIOCfg(eBoardID const config){
布尔成功= false;
uint8_t cfg;
uint8_t buf;
//
...一些初始化
////// Hwi
配置
中断PinHandle = PIN_open(&interruptPinState, interpinTable);
if (PinruptPin_Close){_Pin_PIN=
返回<pin
}
gInit =成功;
返回成功;
}
bool getIOCfg(uint8_t * const data){
IF(data == NULL){
返回FALSE;
}
bool成功;
device_select();
成功= sensorReadReg(REG_input, data, reg_length);
device_unecure();
*data =~(*data);// 输入返回1,输出返回0 ->反向更直观。
返回成功;
}
#pragma optime=none
bool readIOs(uint8_t * data){
IF(data == NULL){
返回FALSE;
}
bool成功;IF(!device_select=)
回写<rag_reg),reg_restorag_reg =返回<_reopen;<_reprox_re>
*DATA =*DATA & gIoConfig; //掩码输出引脚。
返回成功;
}
布尔writeIOs (uint8_t const data, uint8_t const mask){//
读取当前值
bool成功;
uint8_t readReg;
uint8_t
reg eReg =数据;//读取当前输出寄存器device_select();reg
读数=读数=读数 掩码,&writeReg);
writeReg ==~gIoConfig; //掩码输出所有输入
成功&= sensorWriteReg (REG_OUTPUT,&writeReg,REG_length);
DEVICE_DESICA();
返回成功
;}
静态交换机在配置文件
/*=================中初始化 SWI配置================= */
var expanderInterruptParams = new Swi.Params();
expanderInterruptParams.arg0 = 1;
expanderInterruptParams.arg1 = 0;
expanderInterruptParams.priority = 1;
expanderInterruptParams.trigger = 0;
program.global.swiExpanderInterrupt = swi.create("&derruptStatusSwi", expanderInterruptParams);
无论我在Hwi或Swi上下文中调用REGISTER READ,都返回FALSE。
我的问题是,我是否错过了Hwi/Swi的任何配置? 我是否需要考虑任何先决条件,以便我可以在中断上下文中使用I2C通信?