此贴是在第一帖基础上进行的,增加SPI的PDMA方式完成对W25Q16BV的读写操作,在调试过程中对page0的读操作后通过UART发送到PC出现了异常,发送到中途就停止但LED1的闪烁正常,通过Lee老师的指导,错误原因为uart0.put_numeral调用了puts,但puts的入口参数为ASCII,在此非常感谢老师孜孜不倦的教诲!
具体调整如下:
1.puts调整为cout:程序中通过_LOOK_UART_UPDATA_1208_1条件编译。具体内容为:①.uart0_t类的其他都不变,把put*()都去掉;②.然后加一个write(): 及变量len ③Main.h 中添加#include "redapricot/ostream" ④LOOK_UATR.h 中加入using namespace redapricot;
typedef ostream_t<uart0_t, 16> os_uart0_t;
extern os_uart0_t cout;
取消extern uart0_t uart0;
⑤LOOK_UART.CPP 中添加os_uart0_t cout; 取消uart0_t uart0;
2.调整数据读取时间:原为isr中调整为dsr中,程序中通过_LOOK_UART_UPDATA_1208_2条件编译。具体内容为:①
isr()中关闭RDA中断,然后返回true,if (UART0.ISR().RDA_INT) {
// 关闭RDA中断
return true;
}
②在dsr()中检查RDA_IF,读取数据。读完后再打开RDA中断。dsr()
{
while (RDA_IF) {
读数据;
}
打开RDA中断
}
3.增加SPI的PDMA方式对W25Q16BV的读写操作:
UART0 接收到字符‘R’或‘r’实现读取W25Q16BV Page0 的内容;
UART0 接收到字符‘U’或‘u’实现W25Q16BV Page0 的内容加1;
UART0 接收到字符‘D’或‘d’实现W25Q16BV Page0 的内容减1;
UART0 接收到字符‘M’或‘m’实现读取W25Q16BV制造商ID及设备ID。
备注:以上调整详见工程包中具体代码!
运行截图:
未调整UART的故障截图:
工程包:
LOOK_SPI_PDMA_V111018.2.rar
(75.87 KB)
|