工具/软件:TI-RTOS
您好!
我正在使用 MCU SPI 从从器件读取数据。 从器件通过触发外部中断来标记已准备好提供数据的器件。 在中断中、我发布一个信号量来解锁 SPI_transmission。 当我以低带宽对其进行测试时、它工作正常。 最后、我的从器件以31.3kHz 的频率触发中断、我需要读取2个16位帧。 当我以该频率运行时、从器件触发信号和执行 SPI 任务之间的延迟开始过大。 在外部中断例程中、我只需切换一个引脚(仅供参考)并布置 SPI 信标。 在下面的示波器屏幕截图中、蓝色信号是一个参考信号、一旦代码跳转到 drdy ()例程、该信号就应该被切换、绿色信号是从器件的触发器(下降沿是 callign drdy ())。存在~4us 延迟。 当您查看紫色波形时、延迟甚至更大、紫色波形是 SPI 的信号之一(从器件使能信号)。
我正在使用两个任务和一个 Hwi。 一个任务没有 while ()循环,只会在请求时运行以配置从属设备(DAC_conf ())。 另一个任务 masterTaskFxn()是一个 SPI 传输任务。 我可以在 ROV 中看到、执行初始化后、第一个任务就会终止。 然后、只有 idle()、 masterTaskFxn()和 hwi 看起来是活跃的。 这种明显的延迟是由 RTOS 调度 程序本身引入的延迟造成的、还是我可以做得更好?
void hardware_init (void)
{
// SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
//启用计时器2
//
// Auxilaty SPI 引脚
//
GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、GPIO_PIN_5);//初始化 PF4作为输入
GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、32);//将 PF4作为输入
GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、GPIO_PIN_3);//初始化 PF4作为输入
GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_3、8);//将 PF4作为输入
GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、GPIO_PIN_2);//初始化 PF4作为输入
GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_3、4);//将 PF4作为输入
}
//
*=== GPIO/DRDY HWI ===
//
void drdy (unsigned int index)
//void drdy (void)
{
// semaphore_post (tcp_semaphore);
GPIO_TOGGLE (Board_test);//将 PF4作为输入
Semaphore_post (SPI_Semaphore);
}
/*
====== SPI 测量传输任务====
//
void masterTaskFxn (UARg arg0、UARg arg1)
{
SPI_Handle masterSpi;
SPI_Transaction masterTransaction;
SPI_Params spiParams;
bool transferOK;
SPI_Params_init (&spiParams);
spiParams.transferMode = SPI_MODE_BLOCKING;
spiParams.transferTimeout = SPI_WAIT_FOREVER;
spiParams.transferCallbackFxn =空;
spiParams.mode = SPI_MASTER;
spiParams.bitrate = 10000000;
spiParams.dataSize = 16;
spiParams.frameFormat=SPI_POL1_PHA1;
Semaphore_pend (SPI_Semaphore、BIOS_wait_forever);
/*将 SPI 句柄初始化为默认主控*//
masterSpi = SPI_open (0、&spiParams);
masterSpi = SPI_open (Board_SPI0、&spiParams);
masterTxBuffer2[0]=0b0001000000000;
masterTxBuffer2[1]=0b0000000000000000;
masterTxBuffer[0]= 0b00010010;
/*启用中断*/
GPIO_enableInt (Board_BUTTON0);
while (1)
{
Semaphore_pend (SPI_Semaphore、BIOS_wait_forever);
/*初始化主 SPI 事务结构*/
ctr1=ctr1+1;
masterTransaction.count = 1;//事务的帧数
masterTransaction.txBuf =(ptr) masterTxBuffer;
masterTransaction.rxBuf =(ptr) masterRxBuffer;
/*启动 SPI 传输*/
transferOK = SPI_transfer (masterSpi、&masterTransaction);
// if (transferOK){
// /*主接收缓冲区的打印内容*//
System_printf ("主设备:%s\n"、masterRxBuffer);
//}
//否则{
// System_printf ("主器件 SPI 传输失败");
//}
/*取消初始化 SPI */
SPI_CLOSE (masterSpi);
System_printf ("done");
system_flush();
}/*
==== 配置任务====
*/
void DAC_conf (UArg0、UArg0 arg1)
{
SPI_Handle masterSpi_DAC;
SPI_Transaction masterTransaction_DAC;
SPI_Transaction masterTransaction_s2p;
SPI_Transaction masterTransaction_ADC;
SPI_Params spiParams_DAC;
bool transferOK;
SPI_Params_init (&spiParams_DAC);
spiParams_dac.transferMode = SPI_MODE_BLOCKING;
spiParams_dac.transferTimeout = SPI_WAIT_FOREVER;
spiParams_dac.transferCallbackFxn =空;
spiParams_dac.mode = SPI_MASTER;
spiParams_dac.bitrate = 5000000;
spiParams_dac.dataSize = 16;
spiParams_dac.frameFormat=SPI_POL1_PHA1;
// Semaphore_pend (SPI_Semaphore_DAC、BIOS_wait_forever);
/*将 SPI 句柄初始化为默认主控*/
masterSpi_DAC = SPI_open (0、&spiParams_DAC);
// masterSpi = SPI_open (Board_SPI0、NULL);
/*初始化主 SPI 事务结构*/
masterTransaction_dac.count = 1;//事务的帧数
masterTransaction_dac.txBuf =(ptr) dac_Buffer;
masterTransaction_dac.rxBuf =(ptr) masterRxBuffer;
GPIOPinWrite (GPIO_PORTB_BASE、GPIO_INT_PIN_5、0);//初始化 PF4作为输入
/*启动 SPI 传输*/
transferOK = SPI_transfer (masterSpi_DAC、&masterTransaction_DAC);
GPIOPinWrite (GPIO_PORTB_BASE、GPIO_INT_PIN_5、32);//初始化 PF4作为输入
DAC=1;
// Semaphore_pend (SPI_Semaphore_DAC、BIOS_wait_forever);
/*初始化主 SPI 事务结构*/
masterTransaction_s2p.count = 1;//事务的帧数
masterTransaction_s2p.txBuf =(ptr) S2P_Buffer;
masterTransaction_s2p.rxBuf =(ptr) masterRxBuffer;
GPIOPinWrite (GPIO_PORTB_BASE、GPIO_INT_PIN_3、0);//初始化 PF4作为输入
/*启动 SPI 传输*/
transferOK = SPI_transfer (masterSpi_DAC、&masterTransaction_s2p);
GPIOPinWrite (GPIO_PORTB_BASE、GPIO_INT_PIN_3、8);//初始化 PF4作为输入
DAC=2;
// Semaphore_pend (SPI_Semaphore_DAC、BIOS_wait_forever);
GPIOPinConfigure (GPIO_PD2_SSI2FSS);
GPIOPinTypeSSI (GPIO_PORTD_base、GPIO_PIN_0 | GPIO_PIN_1 |
GPIO_PIN_2 | GPIO_PIN_3);
masterTxBuffer[0]= 0b0100000100000001;
/*初始化主 SPI 事务结构*/
masterTransaction_adc.count = 1;//事务的帧数
masterTransaction_adc.txBuf =(ptr) masterTxBuffer;
masterTransaction_adc.rxBuf =(ptr) masterRxBuffer;
transferOK = SPI_transfer (masterSpi_DAC、&masterTransaction_ADC);
DAC=3;
// Semaphore_pend (SPI_Semaphore_DAC、BIOS_wait_forever);
masterTxBuffer[0]= 0b00001000;
/*初始化主 SPI 事务结构*/
masterTransaction_adc.count = 1;//事务的帧数
masterTransaction_adc.txBuf =(ptr) masterTxBuffer;
masterTransaction_adc.rxBuf =(ptr) masterRxBuffer;
transferOK = SPI_transfer (masterSpi_DAC、&masterTransaction_ADC);
DAC=4;
/*取消初始化 SPI */
SPI_Close (masterSpi_DAC);
/*打开将在循环中发送测量值的新 SPI 连接*/
Semaphore_post (SPI_Semaphore);
/*启用中断*/
GPIO_enableInt (Board_BUTTON0);
// GPIOIntEnable (GPIO_PORTB_BASE、GPIO_PIN_4);
if (transferOK){
/*打印主接收缓冲区的内容*/
System_printf ("配置完成\n");
}
否则{
System_printf ("主 SPI 传输失败");
}
system_flush();
}/*
==== main ====
*/
int main (void)
{
/*构造 BIOS 对象*/
Task_Params taskParams2;
Task_Params 任务参数3;
/*呼叫板初始化函数*/
Board_initGeneral();
Board_initGPIO();
Board_initSPI();
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
GPIOPinTypeGPIOOutput (GPIO_PORTD_base、GPIO_PIN_2);//初始化 PF4作为输入
GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_2、4);//将 PF4作为输入
hardware_init();
/*安装按钮回调*/
GPIO_setCallback (Board_BUTTON0、drdy);
////启用中断*//
GPIO_enableInt (Board_BUTTON0);
//构造主线程*
Task_Params_init (&taskParams2);
taskParams2.priority = 2;
taskParams2.STACKSIZE = TASKSTACKSIZE;
taskParams2.stack =_task0Stack;
Task_construction (&task0Struct,(Task_FuncPtr) masterTaskFxn、&taskParams2, NULL);
//构造主 DAC 任务线程
Task_Params_init (&taskParams3);
taskParams3.priority = 1;
taskParams3.STACKSIZE = TASKSTACKSIZE;
taskParams3.stack =&task1stack;
Task_construct(&task1Struct、(Task_FuncPtr) DAC_conf、&taskParams3、NULL);
/*启动 BIOS */
BIOS_start();
返回(0);
}
