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.
工具/软件: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:
谢谢、
Alexis
您好、Alexis、
这个问题似乎与我的问题类似。
但我找不到解决方案。 这是我不理解的吗?
谢谢
尊敬的 Joonbum:
以下是我之前链接的帖子中经过验证的建议解决方案:
"您可以根据首先从 HWI 上下文中从 ADC1298生成的中断使用信标发布。 由于您是 SPI 上的主器件,因此您可以使用线程调用带有回调函数版本的 SPI_TRANSFERT(),这样您就不会阻塞其他线程。 关键是、您不希望只轮询其他线程即可接收 SPI 数据。"
谢谢、
Alexis
您好、Alexis、
好的。
我知道你的意思。
这个问题没有及时得到解决,现在已经被放弃了。 我下次会再试一次。
谢谢你。