Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在SPI(SSP)总线上使用DMA读取EEPROM_C_Embedded_Dma_Eeprom_Ssp - Fatal编程技术网

C 在SPI(SSP)总线上使用DMA读取EEPROM

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

我使用的是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.
// 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缓存?