工具/软件:
大家好:
我的 PCB 板集成了 SPI ADC MAX11337 芯片。 我的目标是每 1ms 通过 SPIB 向 SPI ADC 芯片传输 10 个字节、每个字节由一个单独的 CS 脉冲触发。 这就是 DMA 或 FIFO 模式不适用的原因、因为它们不会自动处理 CS 脉冲。
该过程从 Timer1 ISR 中的第一个字节开始。 后续字节在 SPI RX 中断期间一次发送一个、直到发送所有 10 个字节(在 10 个 SPI 中断中)。 之后、禁用 SPI RX 中断。
我目前面临的问题是从 Timer1 ISR 内发送第一个 SPI 字节后不会触发 SPIRX 中断。 但是、如果从非 ISR 例程(例如主循环)执行 SPI 写入、则 SPIRX 中断会按预期运行 。
以下是我的代码:
初始化
CPU 计时器 1 每 1ms 中断一次
void timer1_1ms_init(){
CPUTimer_setEmulationMode(timer1_1ms_BASE, CPUTIMER_EMULATIONMODE_STOPAFTERNEXTDECREMENT);
CPUTimer_setPreScaler(timer1_1ms_BASE, 200U);
CPUTimer_setPeriod(timer1_1ms_BASE, 1000U);
CPUTimer_enableInterrupt(timer1_1ms_BASE);
CPUTimer_stopTimer(timer1_1ms_BASE);
CPUTimer_reloadTimerCounter(timer1_1ms_BASE);
CPUTimer_startTimer(timer1_1ms_BASE);
}
SPIB:非 FIFO。 开启中断 SPI_INT_RX_DATA_TX_EMPTY
void spi_adc_init(){
SPI_disableModule(spi_adc_BASE);
SPI_setConfig(spi_adc_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL1PHA0,
SPI_MODE_CONTROLLER, spi_adc_BITRATE, spi_adc_DATAWIDTH);
SPI_setPTESignalPolarity(spi_adc_BASE, SPI_PTE_ACTIVE_LOW);
SPI_disableFIFO(spi_adc_BASE);
SPI_disableLoopback(spi_adc_BASE);
SPI_setEmulationMode(spi_adc_BASE, SPI_EMULATION_STOP_MIDWAY);
SPI_enableModule(spi_adc_BASE);
}
void INTERRUPT_init(){
// Interrupt Settings for INT_timer1_1ms
// ISR need to be defined for the registered interrupts
Interrupt_register(INT_timer1_1ms, &timer1_1ms_ISR);
Interrupt_enable(INT_timer1_1ms);
}
在计时器 1 中断时、将第一个字节写入中的 SPI max11337_start ()
__interrupt void timer1_1ms_ISR(void)
{
if(max11337_ready()){
max11337_start();
}
}
2.这会将第一个 SPI 字节写入 MAX11337。
void max11337_start(void)
{
// Prime first word to start transfer
txIndex = 1;
rxIndex = 0;
// Enable SPI RX interrupt
SPI_clearInterruptStatus(SPIB_BASE, SPI_INT_RX_DATA_TX_EMPTY);
SPI_enableInterrupt(SPIB_BASE, SPI_INT_RX_DATA_TX_EMPTY);
// Enable CPU interrupt group
Interrupt_enable(INT_SPIB_RX);
// Set CS low
GPIO_writePin(SPI_ADC_CS, 0);
// Write the first byte
SPI_writeDataNonBlocking(SPIB_BASE, spiTxBuffer[0]);
}
3. SPIRX 中断处理程序
__interrupt void spi_rx()
{
// 1. Toggle CS high
GPIO_writePin(SPI_ADC_CS, 0);
// 2. Read the received word
spiRxBuffer[rxIndex++] = SPI_readDataNonBlocking(SPIB_BASE);
// 3. Clear interrupt flags
SPI_clearInterruptStatus(SPIB_BASE, SPI_INT_RX_DATA_TX_EMPTY);
// 4. Send next word if available
if (txIndex < 10)
{
// Toggle CS low
GPIO_writePin(SPI_ADC_CS, 0);
SPI_writeDataNonBlocking(SPIB_BASE, spiTxBuffer[txIndex++]);
}
else
{
// All data sent and received, disable RX interrupt
SPI_disableInterrupt(SPIB_BASE, SPI_INT_RX_DATA_TX_EMPTY);
}
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP6); // SPIB = Group 6
}
有人能指出我的代码出了什么问题吗?