C 在SPI(SSP)总线上使用DMA读取EEPROM
我使用的是NXP LH79525,基于ARM7TDMI的处理器。有一个EEPROM通过SPI总线连接到SSP端口 目的是将EEPROM读入SRAM,以便更快地访问 当前工作代码向EEPROM发送读取命令,每个字节读取数据字节,这需要很长时间 我想使用DMA直接读取SPI总线上的EEPROM,而不需要CPU的干预 以下是我的代码片段:C 在SPI(SSP)总线上使用DMA读取EEPROM,c,embedded,dma,eeprom,ssp,C,Embedded,Dma,Eeprom,Ssp,我使用的是NXP LH79525,基于ARM7TDMI的处理器。有一个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
// 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已在此代码片段之前初始化,用于读取字节 我正在寻找一个有效的代码示例片段,但在web上没有找到。根据表5-1,似乎SSPRX被分配给了流0,并且只支持半个字的源数据宽度(表5-15)
您的代码似乎使用了流2和字节寻址。虽然这是一个软件问题,但如果您可以监控数据,以确定EEPROM是否提供了处理器未采集的有效数据,或者批量操作不正确且EEPROM未提供正确的数据,则会有所帮助。你可以考虑一些类似逻辑分析器(也许是一个简单的CYC68013A板,代码< SigRok> <代码>,或者如果它不是太快的<代码>总线海盗< /代码>,或者你可以翻阅数据表并仔细检查你的假设,或者,你可以在EEPROM中编程一个巧妙的模式,只需在一个范围内查看读取。我正在比较使用直接SSP访问读取的数据与通过DMA读取的数据。这就是我如何知道数据不正确的原因。是的,但您不知道快速读取操作的问题是否导致EEPROM发出坏数据,或者DMA或SPI外围设备设置的问题是否导致DMA引擎无法收集和存储EEPROM发出的有效数据。您可以做的另一件事是用一个计数器代替EEPROM,并将MISO连接到不同的计数器输出位,如果DMA和SPI设置正确,它将以可预测的模式提供通过缓冲区更改的数据。我假设您在验证数据之前正在刷新CPU缓存?