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.

[参考译文] CCS/MSP432P401R:GPIO 中断

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/834762/ccs-msp432p401r-gpio-interrupt

器件型号:MSP432P401R

工具/软件:Code Composer Studio

我将 MSP432P401R 与 TI-RTOS (CCS)搭配使用。

我的系统有3个任务(ADC、以太网、编码器)。

编码器连接到 GPIO 中断。

ADC 任务在12、500Hz 计时器上运行、并在计时器回调函数内将其读取为 SPI。

由于 SPI 函数消耗的时间约为80us、因此可以说它在这里消耗的时间大部分。

问题是编码器中断读取不正确。

编码器产生2000个脉冲/r  当我快速移动编码器时、只会生成10个脉冲。  我 需要非常缓慢地移动以生成2000个脉冲。

我已经对其进行了测试、似乎与 ADC 任务的计时器存在冲突。

当 ADC 任务在10Hz 计时器上运行时、编码 器工作正常。

CAN 中断和定时器冲突?

如何解决?(中断优先级? 多中断?)

谢谢你。

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

    尊敬的 Joonbum:

    如何设置 SPI 传输模式? 它默认为 SPI_MODE_BLOCKING、这将阻止任务执行、直到事务完成或发生超时。 由于您说 SPI 事务大部分时间都在占用、这可能是您缺少 GPIO 中断的原因。   

    如果是这种情况、也许可以尝试改用 SPI_callback_mode、因为它不会阻止任务执行、因此在任务或中断上下文中使用是安全的。   

    谢谢、

    Alexis

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

    您好、Alexis、

    非常好的主意!

    那么、我现在要尝试它。

    但它无法正常读取。

    它不会触发回调函数。

    您是否有使用回叫模式的示例?

    我尝试过如下操作:

    空 UserCallback1Fxn (SPI_Handle SPI、SPI_Transaction*事务)
    {
    printf ("callback1\n");
    }
    
    静态 void ADS1158_spiInit (void)
    {
    SPI_Params_init (&adc1SpiParams);
    adc1SpiParams.transferMode = spi_mode_callback;//
    adc1SpiParams.transferCallbackFxn =用户 Callback1Fxn;
    adc1SpiParams.frameFormat = SPI_POL0_PHA0;
    adc1SpiParams.bitrate = 12000000;
    
    adc1Spi = SPI_open (Board_SPI0、&adc1SpiParams);
    if (adc1Spi = NULL){
    printf ("初始化 SPI 1\n"\n 时出错);
    }
    }
    
    静态无符号字符 ADS1158_spiReadID (int DeviceID)
    {
    uint8_t gpioIndex;
    SPI_Transaction spiTransaction;
    SPI_Handle spiHandle;
    unsigned char rxBuffer[2];
    unsigned char txBuffer[2];
    bool transferOK;
    
    txBuffer[0]= opcode_RREG |(REG_ADDR_ID 和 opcode_a_mask);
    spiTransaction.count = 2;
    spiTransaction.txBuf =(void *) txBuffer;
    spiTransaction.rxBuf =(void *) rxBuffer;
    
    if (DeviceID = 1){
    gpioIndex = Board_GPIO_ADC_CS_1;
    spiHandle = adc1Spi;
    } 否则、如果(DeviceID = 2){
    gpioIndex = Board_GPIO_ADC_CS_2;
    spiHandle = adc2Spi;
    }
    
    GPIO_WRITE (gpioIndex、Board_GPIO_LOW);
    transferOK = SPI_transfer (spiHandle、&spiTransaction);
    if (!transferOK){
    printf ("传输失败\n");
    }
    GPIO_WRITE (gpioIndex、Board_GPIO_HIGH);
    
    返回 rxBuffer[1];
    } 

    谢谢你。

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

    尊敬的 Joonbum:

    我想您可能会发现此相关主题对 您有所帮助:https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/611917?RTOS-MSP432P401R-Clarification-about-SPI-transfer-from-a-HWI-context- 

    谢谢、

    Alexis

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

    您好、Alexis、

    这个问题似乎与我的问题类似。

    但我找不到解决方案。 这是我不理解的吗?

    谢谢

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

    尊敬的 Joonbum:

    以下是我之前链接的帖子中经过验证的建议解决方案:

    "您可以根据首先从 HWI 上下文中从 ADC1298生成的中断使用信标发布。 由于您是 SPI 上的主器件,因此您可以使用线程调用带有回调函数版本的 SPI_TRANSFERT(),这样您就不会阻塞其他线程。 关键是、您不希望只轮询其他线程即可接收 SPI 数据。"

    谢谢、

    Alexis

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

    您好、Alexis、

    好的。

    我知道你的意思。

    这个问题没有及时得到解决,现在已经被放弃了。 我下次会再试一次。

    谢谢你。