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.

[参考译文] RTOS/MSP430FR5969:TI-RTOS 2.20 - I2Ctmp006示例不起作用- I2C_TRANSFORT()存根

Guru**** 2609955 points
Other Parts Discussed in Thread: MSP430FR5969

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/660034/rtos-msp430fr5969-ti-rtos-2-20---i2ctmp006-example-does-not-works---i2c_transfer-stucks

部件号:MSP430FR5969

工具/软件:TI-RTOS

您好,

我们正在使用德州仪器(TI)的6.2 0程序,

MCU MSP430FR5969以及Bosh BME280传感器,

它通过I2C连接到TI-RTOS 2.20 通信系统和XDCtools 3.32 .0.6 下的MCU。

在6.2 中,我们下载了“i2ctmp006_MSP_EXP430FR5969”示例。 寄存器已更改为BME280。

在“MSP_EXP430FR5969.c”文件中,通过这些引脚将传感器连接到MCU已通过以下函数进行了配置:

void MSP_EXP430FR5969_initI2C (void){/*



注:TI-RTOS示例将EUSCIB0配置为SPI或I2C。 因此

,*

当I2C和SPI驱动程序同时在*一个应用程序中使用时,会发生冲突。 在

运行应用程序之前,修改此文件中的pin mux设置并解决*冲突。

*/

GPIO _setAsPeripheralModuleFunctionInputPin (GPIO_PORT_P3,

GPIO _PIN6 | GPIO _PIN5,GPIO _secondary _module_function);

I2C_INIT();

} 

在文件"i2ctmp006.cfg"中,脚本末尾添加了以下内容:

var hwiParams = new halHwi.Params();

/* eSCI驱动程序的I2C Hwi */

hwiParams.arg = 1;

halHwi.create(47,"&I2CEUSCIB_hwiIntFxn",hwiParams); 

在文件"i2ctmp006.c"中,负责读取/写入传感器的任务已编程

void taskFxn (UArg arg0,UArg arg1)

{

unsigned int i;

uint8_t txBuffer[2];

uint8_t rxBuffer[2];

I2C_handle i2c;

I2C_Params i2cParams;

I2C_Transaction i2cTransaction;

/*创建I2C以供使用*/

I2C_Params_init(&i2cParams);

i2cParams.transferMode = I2C_MODE_callback;

i2cParams.bitrate =}_400kHz;

// i2cParams.custom =

i2c_open(Bon_I2C_I2C_I2C_TMP, I2C=i2C_Initializing_I2c= i2C; I2c= i2C_









系统=已初始化i2c_自动1c_系统



/*指向T环境寄存器并读取其2字节*/

txBuffer[0]= 0xE0;

txBuffer[1]= 0xB6;

i2cTransaction.slaveAddress = 0x76;//Board_TMP006_ADDR;

i2cTransaction.writeBuf = txBuffer;

i2cTransaction.writeCount = 2;

i2cTransaction.readBuf = NULL;

i2cTransaction.ReadCount = 0;

//重置

I2C_TRANSFER (i2c,&i2cTransaction);

TASK_SLEEP(3000);

txBuffer[0]= 0xD0;

i2cTransaction.slaveAddress = 0x76;//Board_TMP006_ADDR;

i2cTransaction.writeBuf = txBuffer;

i2cTransaction.writeCount = 1;

i2cTransaction.readBuf = rxBuffer;

i2cTransaction.ReadCount = 1;

/*提取20个样本并将其打印到控制台*/

(i = 0;i < 20;i++){

IF (I2C_transfer (i2c,&i2cTransaction)){

System_printf ("Sample System_Buffer

,rx[0],%u:c] -%x (C)\n",rxBuffer[1]);System_flush();

}

否则{

System_printf("I2C总线故障\n");System_flush();

}

System_flush();

Task_sleep(1000);}/*



已初始化I2C */

I2C_close(i2c);

System_printf("I2C!_flush();}_System!\n"\}



如果是以下句子  
i2cParams.transferMode = I2C_MODE_blocking;

已更改为

i2cParams.transferMode = I2C_MODE_callback;

它不会被阻止,但不起作用。

我们认为在正常配置上缺少一些东西,但是我们不确定是由于硬件中断还是I2C配置造成的。

谢谢

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

    您好,AArmandoGG:

    WFP的3.5 和WFP的3.6 不能连接到eUSCI模块,只有1.6 的1.7 和WFP的才可以进行I2C通信。  除此之外,您还应提供更多调试详细信息以及通信总线的逻辑分析仪或示波器屏幕截图。

    此致,
    Ryan

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

    你(们)好

    非常感谢。 您对PIN的看法是正确的。 但不幸的是 ,问题仍然存在Frowning2… 您是否介意为我们提供帮助?e2e.ti.com/.../I2CEUSCIB.he2e.ti.com/.../I2CEUSCIB.c

    针脚已通过以下方式连接:

            BME280                MSP430FR5969     

            VCC                  VCC  // 5V

            接地                   

            SCL                   P1_6 // CLK (时钟)

            SDA                  P1_7 //数据

            CSB                   -      //不需要

            SD0                  GND  // slaveaddress:0x76

     

    程序具有以下文件:  

    i2ctmp006.c                                              // main

    Board.h

    MSP_EXP430FR5969.h

    MSP_EXP430FR5969.c

    i2ctmp006.cfg

    配置I2C通信:  

    i2ctmp006.c

    // 适用于以下通信的任务:- TI示例:

    void taskFxn (UArg arg0,UArg arg1)
    {
    UINT8_t txBuffer[2]; //缓冲区de escritura a I2C
    UINT8_t rxBuffer[1]; //缓冲区de lectura de I2C
    
    I2C_HANDLE I2C;
    I2C_Params i2c参数;
    I2C_Transaction i2cTransaction;
    
    /* Creamos I2C */
    I2C_Params_init (&i2cParams);
    i2cParams.transferMode = I2C_MODE_callback;
    i2cParams.transferCallbackFxn =(I2C_CallbackFxn) espera;
    i2cParams.bitrate = I2C_400kHz;
    
    /* Abrimos I2C */
    如果((i2c = I2C_OPEN (Board_I2C_TMP,&i2cParams)==空){ System_abort("Error Initializing I2C\n"); System_flush();}
    否则{ System_printf("I2C已初始化!\n"); System_flush();}
    
    /* Lectura del ID del sensor BME280:寄存器地址0xD0 -寄存器数据:0x60 (valor que se debiera obtener en la lectura)*/
    txBuffer[0]= 0xD0;//寄存器地址
    txBuffer[1]= 0x00;//重置寄存器(Protocolo I2C)
    
    i2cTransaction.slaveAddress = 0x76; //从属地址
    i2cTransaction.writeBuf = txBuffer;
    i2cTransaction.writeCount = 2; //字节a escribir
    i2cTransaction.readBuf = rxBuffer;
    i2cTransaction.ReadCount = 1; //字节更好
    
    
    如果(I2C_TRANSFER(i2c,&i2cTransaction)){ System_printf("Register data:%d (C)\n", rxBuffer[0];System_flush();}
    否则{ System_printf("I2C总线故障\n"); System_flush();}
    
    /* Cerramos I2C */
    I2C_CLOSE (i2c);
    system_printf ("I2C closed!\n");
    
    system_flush();
    }
    

    MSP_EXP430FR5969.h (尚未修改)– 已将其配置为用于I2CB0;我们的意思是EUSCIB0

    /*!

     * @def  MSP_EXP430FR5969_I2CName

     * @ MSP_EXP430FR5969开发板上I2C名称的简要枚举

     */

    typedef enum MSP_EXP430FR5969_I2CName {

      MSP_EXP430FR5969_I2CB0 = 0,

      MSP_EXP430FR5969_I2CCOUNT

    } MSP_EXP430FR5969_I2CName;

    MSP_EXP430FR5969.c

    /*
    =================================== I2C ===================================
    */
    /*放入子部分以允许TI链接器正确删除项目*/
    #if defined(__TI_Compiler_version__)
    #pragma data_section(I2C_config,".const:I2C_config")
    #pragma data_section(i2cEUSCHWIBHWAttrs,".const_IBIB_en_IBIB_599_IUIBI_UI30_Objects[IBI_UI24_IBI_I24_I24_I24_I24_I24_I24_I24_I24_I24_I24_I24_I24_I24_I24_I24_I24_I24_I240.I24_I24_I24_I24_I24_I24_I24_I24_I24_I24_I24_I24_I240.I24_I24_I24_I24_I24_I24_I24_I24_
    
    
    
    
    
    
    
    
    {
    baseAddr = EUSCI_B0_BASE,
    .clockSource = EUSCI_B_I2C_CLOCKSOURCE_SMCLK
    }
    };
    
    const I2C_Config I2C_config[]={
    {
    .fxnTablePtr =&I2CEUSCIB_fxnTable,
    .object =&i2cEUSCIBObjects[0],
    .hwAttrs =&i2cEUSCIBHWAttrs[0]
    },
    {NULL, NULL, NULL}
    ;
    
    /*
    ==== MSP_EXP430FR5969_initI2C =========
    */
    void MSP_EXP430FR5969_initI2C (void)
    {
    /*
    *注:TI-RTOS示例将EUSCIB0配置为SPI或I2C。 因此,
    *当在中同时使用I2C和SPI驱动程序时,会发生冲突
    *应用程序。 修改此文件中的pin mux设置并解决问题
    *在运行应用程序之前发生冲突。
    */
    GPIO _setAsPeripheralModuleFunctionInputPin (GPIO_PORT_P1,
    GPIO _PIN6 | GPIO _PIN7,GPIO辅助模块功能);
    
    I2C_init();
    } 

    // 下面是用于进行通信的PIN:

    i2ctmp006.cfg

    // 在脚本末尾,我们添加了硬件中断捕获,以处理I2C驱动程序:

    var halHWi0Params = new halHWI.Params();
    halHwi0Params.instance.name ="halHWi0";
    Program.global.halHWi0 = halHWI.CREATE (47,"&I2CEUSCIB_hwiIntFxn",halHWi0Params);
    

    //在标题MSP430FR5969.h上,我们发现中断向量指向编号为47的USSCI_B0

    #ifdef __ASM_header__/* begin #defines for assembler */
    #define USI_B0_vector ".int47" /* 0xFFEE USCI B0接收/传输*/
    #其他
    #define USI_B0_vector (47 * 1U) /* 0xFFEE USCI B0接收/发送*/
    #endif 

    ---

    最初,它似乎是Driverlib的TI-RTOS的I2C驱动程序中的一个错误。

    通信开始后,我们会看到如何在分析仪上传输和接收数据。

     问题似乎出在I2CEUSCIB_hwiIntFxn()模块的函数I2CEUSCIB_hwiIntFxn()上,因为它不会选择硬件中断,或者它不会清除它,也不会在读取器缓冲区转储接收到的字节。

    在德克萨斯的所有论坛上,据说驱动程序似乎有处理所提到的中断的信号灯配置错误,因此它一直在无限循环中等待关闭通信。  

    提出了下列可能的解决办法:  

    —Top u a timeout on semaphore (信号量超时)

    -使用I2C_Cancel()函数关闭通信

    -要使用I2C_MODE_callback module AD仅在一个函数中处理上述可能的解决方案,这意味着要操纵驱动程序以访问关键部分。

    (查找附件文件,用于 EUSCIB的I2C驱动器模块)

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    VCC和上拉电阻值是多少? 如果注释中指明的电压为5V,则它将无法在最大工作电压为3.6 V的MSP430器件上正常工作。您是否尝试过在未做任何修改的情况下运行TI-RTOS示例,或者运行C或DriverLib示例? 如果能看到通信总线的意见,将不胜感激。

    此致,
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我向Ryan道歉,这是一个勘误表:VCC=3.3V
    我们已经尝试使用driverlib I2C,它运行良好。 但在RTOS中,我们已经在上述消息中向您解释了问题。

    您是否介意帮助我们解决此问题?

    提前感谢!
    天使
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经提交了一份代码错误调查,并将告知您结果。

    此致,
    Ryan