调试基于ART-PI开发板的QBoot工程,使用到了SPI和QSPI。其中型号为W25Q64JV和W25Q128JV。8M QSPI Flash用于存储运行程序,16M SPI Flash用于存储数据和文件系统。
QSPI Flash在0x8000后面的地址无法写,其中读取到的数据也全部使0XFF。
更改components\drivers\spi\qspi_core.c
文件中第188行
char *ptr = (char *)send_buf;
改为
unsigned char *ptr = (unsigned char *)send_buf;
高位符号扩展
当用更多的内存存储某一个有符号数时,由于符号位位于该数的第一位,扩展之后,符号位仍然需要位于第一位,所以,当扩展一个负数的时候需要将扩展的高位全赋为1.对于正数而言,符号扩展和零扩展是一样的,因为符号位就是0.
比如一个用一个8位二进制表示-1,则是
10000001
如果把这个书用16位二进制表示时,则为11111111 10000001
高位全都是1。
在使用ptr
指针时,有符号的char型扩展为int型时,高位全部扩展为1。造成地址超过0x1000000
。
struct rt_qspi_message message;
unsigned char *ptr = (unsigned char *)send_buf;
rt_size_t count = 0;
rt_err_t result = 0;
message.instruction.content = ptr[0];
message.instruction.qspi_lines = 1;
count++;
/* get address */
if (length > 1)
{
if (device->config.medium_size > 0x1000000 && length >= 5)
{
/* medium size greater than 16Mb, address size is 4 Byte */
message.address.content = (ptr[1] << 24) | (ptr[2] << 16) | (ptr[3] << 8) | (ptr[4]);
message.address.size = 32;
message.address.qspi_lines = 1;
count += 4;
}
else if (length >= 4)
{
/* address size is 3 Byte */
message.address.content = (ptr[1] << 16) | (ptr[2] << 8) | (ptr[3]);
message.address.size = 24;
message.address.qspi_lines = 1;
count += 3;
}
......
原文:https://www.cnblogs.com/lionxy/p/14797110.html