Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.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++ DMA写入SD卡(SSP)不';不能写入字节_C++_Embedded_Sd Card_Dma_Ssp - Fatal编程技术网

C++ DMA写入SD卡(SSP)不';不能写入字节

C++ DMA写入SD卡(SSP)不';不能写入字节,c++,embedded,sd-card,dma,ssp,C++,Embedded,Sd Card,Dma,Ssp,我目前正致力于通过SSP将SD卡驱动程序的阻塞忙等待实现替换为非阻塞DMA实现。然而,实际上并没有写入字节,即使一切似乎都按照计划进行(并没有发现任何错误情况) 首先是一些代码(C++): (免责声明:我还是嵌入式编程的初学者,所以代码可能还不够规范) 是原始二进制转储。请注意,这个精确的模式是完全可复制的:到目前为止,每次我尝试这个,我都得到了完全相同的模式 更新2:不确定它是否相关,但我使用sdram作为内存。当我最终接触到一个逻辑分析仪时,我得到了更多的信息,并且能够解决这些问题 我的

我目前正致力于通过SSP将SD卡驱动程序的阻塞忙等待实现替换为非阻塞DMA实现。然而,实际上并没有写入字节,即使一切似乎都按照计划进行(并没有发现任何错误情况)

首先是一些代码(C++):

(免责声明:我还是嵌入式编程的初学者,所以代码可能还不够规范)

是原始二进制转储。请注意,这个精确的模式是完全可复制的:到目前为止,每次我尝试这个,我都得到了完全相同的模式


更新2:不确定它是否相关,但我使用sdram作为内存。

当我最终接触到一个逻辑分析仪时,我得到了更多的信息,并且能够解决这些问题

我的代码中有一些小错误,但导致这种行为的错误是,我没有在块之前发送“开始块”标记(
0xFE
),也没有在块之后发送16位(虚拟)crc。当我将这些添加到传输缓冲区时,所有内容都已成功写入

因此,此修复程序如下所示:

bool write (size_t block, uint8_t const * data, size_t blocks) {
    //TODO: support more than one block
    ASSERT(blocks == 1);

    printf("Request sd semaphore (write)\n");
    sd_semaphore.take();
    printf("Writing to block " ANSI_BLUE "%d" ANSI_RESET "\n", block);

    SD::write_buffer[0] = 0xFE; //start block

    memcpy(&SD::write_buffer[1], data, BLOCKSIZE);

    SD::write_buffer[BLOCKSIZE + 1] = 0; //dummy crc
    SD::write_buffer[BLOCKSIZE + 2] = 0;

    //...
}

作为旁注,第一个数据块没有被写入的原因很简单,因为我没有等到设备准备好后才发送第一个数据块。这样做解决了问题。

添加了
嵌入式
标签,以吸引更多的受众
uint8_t block[512];
for (int i = 0; i < 512; i++) {
    block[i] = (uint8_t)(i % 256);
}
if (!SD::write(10240, block, 1)) { //this one isn't actually written
    WARN("noWrite", proc);
}
if (!SD::write(10241, block, 1)) {
    WARN("noWrite", proc);
}
if (!SD::write(10242, block, 1)) {
    WARN("noWrite", proc);
}
if (!SD::write(10243, block, 1)) {
    WARN("noWrite", proc);
}
bool write (size_t block, uint8_t const * data, size_t blocks) {
    //TODO: support more than one block
    ASSERT(blocks == 1);

    printf("Request sd semaphore (write)\n");
    sd_semaphore.take();
    printf("Writing to block " ANSI_BLUE "%d" ANSI_RESET "\n", block);

    SD::write_buffer[0] = 0xFE; //start block

    memcpy(&SD::write_buffer[1], data, BLOCKSIZE);

    SD::write_buffer[BLOCKSIZE + 1] = 0; //dummy crc
    SD::write_buffer[BLOCKSIZE + 2] = 0;

    //...
}