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:I2C_TRANSFER()在 CallBackClock()中崩溃

Guru**** 2557810 points
Other Parts Discussed in Thread: CC2640R2F

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/599812/rtos-i2c_transfer-crashes-in-callbackclock

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

工具/软件:TI-RTOS

您好!

我尝试使用周期性时钟来进行 I2C 采集。 首先调用 GSensorInit()来启动时钟,然后调用 GSensorStart()来启动周期性回调。 源代码如下:

空 Acc_readAcc (Int16 *pBuff)

uint8 txBuf[1];
int32 x、y、z;//、s;
int32 x1、y1、z1;

txBuf[0]= MPU6050_RA_ACCEL_XOUT_H;
i2cTrans.writeBuf = txBuf;
i2cTrans.writeCount = 1;
i2cTrans.readBuf = pBuff;
i2cTrans.ReadCount = 6;
i2cTrans.slaveAddress = MPU6050_ADDRESS_AD0_LOW;
I2C_transfer (handle、&i2cTrans);

//
//通过 I2C 进行 G 传感器控制
//
空 GSensorClock (UArg-参数)

int y;
int16数据[8];
Util_startClock (周期时钟);
事件|= arg;
Semaphore_post (SEM);
ACC_readAcc (data);
y =(DATA[6]/10)+ 10;//
牵引波形(y、270);

空 GSensorInit()

字符 str[20];
uint8 res=I2CInit();
sprintf (str、"I2C init=0x%x"、res);
lcd_write_string (str、lcd_page7);
Util_constructClock (&periodicClock、GSensorClock、SBP_PERIOD_EVT_PERIOD、0、false、 SBP_Periode_EVT);

void GSensorStart()

Util_startClock (周期时钟);

问题是、每次代码崩溃时、I2C_TRANSF()被称为 witchin Acc_readAcc ()。

我还尝试了以下代码、该代码工作正常:

void Dimetek_Loop ()

字符 str[25];
int16 y;
int16数据[8];
Board_PWM_STOP();
for (;;){
ACC_readAcc (data);
sprintf (str、"z=%6d"、data[2]);
lcd_write_string (str、lcd_Page2);
Task_sleep (10 * 1000 / Clock_tickPeriod);

我弄错了吗? 还是应该添加更多代码? 欢迎提出任何意见。 提前感谢。

此致、Young

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    忘了说我对片上 AD 转换使用了相同的例程、这很好:

    空 GSensorClock (UArg-参数)

    int y;
    Util_startClock (周期时钟);
    UINT ADC=TriggerADC();
    y =(ADC / 10)+ 10;//
    牵引波形(y、270);
    事件|= arg;
    Semaphore_post (SEM);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您使用的是什么器件?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    cc2640r2f
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    必须从任务调用 I2C_transfer 调用。 时钟回调在 Swi 上下文中运行。

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

    谢谢、Todd。 那么我应该怎么做才能在回调时完成 I2C_transfer()?

    此致、Young

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

    如果您希望以特定速率执行 SPI_TRANSFCTION、则可以让时钟函数发布信标。 然后在同一个信标上有一个阻止的任务。 取消阻止后、任务可以执行 SPI_TRANSFRA传输。

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

    解决了。 非常感谢。

    在 taskFxn()中,执行以下操作:

    IF (事件和 SBP_Periode_EVT)

    事件&=~SBP_Periode_EVT;
    GSensorProcessEvt();