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