我正在使用基于ARM7TDMI的NXP LH79525处理器。 EEPROM通过SPI总线连接到SSP端口。

目的是将EEPROM读入SRAM,以加快访问速度。

当前的工作代码向EEPROM发送读取命令,读取每个字节的数据字节,这需要很长时间。

我想使用DMA直接在SPI总线上读取EEPROM,而无需CPU的干预。

这是我的代码段:

// Initialize the DMA for use with SPI bus.
// Source is the EEPROM on the SPI bus.
// Destination is "buffer".

p_dma_stream_2->source_low = 0U;
p_dma_stream_2->source_high = 0U;
const uint32_t dest_addr = (uint32_t) buffer;

p_dma_stream_2->dest_low = (dest_addr & 0xFFFFU);
p_dma_stream_2->dest_high = (dest_addr >> 16U);

p_dma_stream_2->max_count = bytesToRead;

*p_dma_intr_mask = 0U;  // Disable all dma interrupts.
*p_dma_intr_clear = 0xFF;   // Clear the interrupts.

SSP->dmacr = 0x01;  // Enable reading with DMA

p_dma_stream_2->control = 0x06U; // + 0x01 to enable transfer.

// 0x400 - status of stream 2. 1 == stream is active.

uint32_t status = *p_dma_status;
while ((status & 0x400U) != 0U)
{
    OSTimeDelay(10U); // 10 milliseconds
    status = *p_dma_status;
}


使用以上示例时,我从EEPROM读取了不正确的值。
DMA寄存器正确计数。
为了读取字节,已在此代码段之前对SSP进行了初始化。

我正在寻找一个有效的代码示例片段,但尚未在网络上找到任何示例。

最佳答案

根据此User's Guide表5-1,似乎SSPRX已分配给流0,并且仅支持半字源数据宽度(表5-15)。

您的代码似乎使用Stream 2和字节地址。

关于c - 使用DMA读取SPI(SSP)总线上的EEPROM,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22544603/

10-12 19:37