工具/软件:
大家好、感谢观看。
我尝试在主模式下使用 F280049C 的 SPI 并使用 FIFO 连接 EEPROM。 在我的应用程序中、有时 CPU 会写入 TXBUF(短命令)、其他情况下则是 DMA(长数据数组)。
我从 SPI_EX7_EEPROM_DMA 修改了一个简单的代码。 它从空 FIFO(字长为 8 位)开始、并使用 SPI_writeDataNonBlocking 向 TX_BUF 数组 (0x1100、0x2200 ... 0x9900) 写入、但我在逻辑分析仪上看到以下内容:

如您所见、对于大多数字 、只有两个时钟周期、只有在代码停止写入时、我们才会得到一个完整字。
如果我 暂停 MCU(我正在 LaunchPad 上进行测试)、设置 SPIPRI = 0x0000、然后使用调试器手动逐个写入 TXBUFF(观察 TXFFST 增加情况)、然后设置 SPIPRI.FREE=1、得到预期的序列:

以下是我在示例配置中更改的内容:
void iniSPI(void){
spiFinished = true;
SPI_Pin_Init();
SPI_Peripheral_Init();
SPI_DMA_Init();
spiRXisr_cnt = 0;
}
void SPI_DMA_Init(void) {
//setupSPI_DMA_Handler(SPI_BASE, 8U, DMA_CH_SPI_TX, DMA_CH_SPI_RX);
}
void SPI_Pin_Init(void)
{
GPIO_setPinConfig(GPIO_8_SPIA_SIMO);
GPIO_setPinConfig(GPIO_9_SPIA_CLK);
GPIO_setPinConfig(GPIO_10_SPIA_SOMI);
GPIO_setPinConfig(GPIO_57_SPIA_STE);
}
void SPI_Peripheral_Init(void)
{
//SPI_EEPROM initialization
SPI_disableModule(SPI_BASE);
SPI_setConfig(SPI_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA0,
SPI_MODE_MASTER, SPI_FREQ, 8);
SPI_enableFIFO(SPI_BASE);
SPI_resetTxFIFO(SPI_BASE);
SPI_resetRxFIFO(SPI_BASE);
SPI_setFIFOInterruptLevel(SPI_BASE, SPI_FIFO_TXEMPTY, SPI_FIFO_RXFULL);
SPI_clearInterruptStatus(SPI_BASE, SPI_INT_RXFF | SPI_INT_TXFF);
SPI_enableInterrupt(SPI_BASE,SPI_INT_TXFF);
SPI_disableLoopback(SPI_BASE);
SPI_setEmulationMode(SPI_BASE, SPI_EMULATION_FREE_RUN);//SPI_EMULATION_STOP_AFTER_TRANSMIT);//MIDWAY
SPI_enableModule(SPI_BASE);
Interrupt_register(SPI_INT_TX, &spiTXisr);
SPI_clearInterruptStatus(SPI_BASE, SPI_INT_TXFF);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP6);
Interrupt_enable(SPI_INT_TX);
}ISR 只会增加一个用于调试目的的计数器并确认中断。
这是我的 main.c:
void main(void)
{
uint16_t i;
//
// Initialize device clock and peripherals
//
Device_init();
//
// Disable pin locks and enable internal pullups.
//
Device_initGPIO();
//
// Initialize PIE and clear PIE registers. Disables CPU interrupts.
//
Interrupt_initModule();
//
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
//
Interrupt_initVectorTable();
iniSPI();
EINT;
ERTM;
char example[20] = {0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0};
i = 0;
while(example[i]){
sendSPIByte(example[i]);
i++;
//while(!spiHasFinished());
}
while(1);
下面是我如何“发送字节“:
void sendSPIByte(uint16_t data) {
spiFinished = false;
SPI_setcharLength(SPI_BASE,8);
SPI_writeDataNonBlocking(SPI_BASE, data<<8);//Writes to register must be left justified
Interrupt_enable(SPI_INT_TX);
}编辑:语法

