OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4812|回复: 8

添加字库出现的有趣问题

[复制链接]

26

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-5-2
在线时间
4 小时
发表于 2015-5-7 17:25:47 | 显示全部楼层 |阅读模式
5金钱
最近遇到一个很有意思的问题,百思不得其解,所以在这发表一下,请教下各位大神,看能不能知道是什么原因。
是这样的,针对战舰版的开发板上的汉字显示实验的例程,我想自己添加多20和24的字库。修改了下例程的代码,然后开始更新。结果问题来了,前面的12,16号字库能正常更新,等到更新20号字库的时候,字库大小1403K(0x15EAF0)个字节,更新的时候是以8个扇区(一个扇区512个字节),4K(0x1000)个字节为单位,当更新到后面剩下的0xAF0个字节,不足一个单位(4K),只能是5个扇区(0xA00个字节),最后是剩下不足一个扇区的0xF0个字节。但是结果是更新失败,然后我设断点跟踪了好久,试了很多种情况,发现在更新到最后剩下0xAF0个字节时,先更新5个扇区(0xA00个字节),这时候在读SD卡函数SD_ReadDisk()里面有一个发送停止命令的函数:
u8 SD_ReadDisk(u8*buf,u32 sector,u8 cnt)
{
u8 r1;
if(SD_Type!=SD_TYPE_V2HC)sector <<= 9;//转换为字节地址
if(cnt==1)
{
r1=SD_SendCmd(CMD17,sector,0X01);//读命令
if(r1==0)//指令发送成功
{
r1=SD_RecvData(buf,512);//接收512个字节   
}
}else
{
r1=SD_SendCmd(CMD18,sector,0X01);//连续读命令
do
{
r1=SD_RecvData(buf,512);//接收512个字节  
buf+=512;  
}while(--cnt && r1==0);
SD_SendCmd(CMD12,0,0X01); //发送停止命令
}   
SD_DisSelect();//取消片选
return r1;//
}
进入到这个函数里面:
u8 SD_SendCmd(u8 cmd, u32 arg, u8 crc)
{
    u8 r1;
u8 Retry=0; 
SD_DisSelect();//取消上次片选
if(SD_Select())return 0XFF;//片选失效 
//发送
    SD_SPI_ReadWriteByte(cmd | 0x40);//分别写入命令
    SD_SPI_ReadWriteByte(arg >> 24);
    SD_SPI_ReadWriteByte(arg >> 16);
    SD_SPI_ReadWriteByte(arg >> 8);
    SD_SPI_ReadWriteByte(arg);  
    SD_SPI_ReadWriteByte(crc); 
if(cmd==CMD12) SD_SPI_ReadWriteByte(0xff);//Skip a stuff byte when stop reading

    //等待响应,或超时退出
Retry=0X1F;
do
{
r1=SD_SPI_ReadWriteByte(0xFF);
}while((r1&0X80) && Retry--);  
//返回状态值
    return r1;
}    
我发现,只要在函数中if(cmd==CMD12) SD_SPI_ReadWriteByte(0xff);Retry=0X1F;这两条语句加上断点,来分步执行,结果就能更新成功。24号的字库也是这样。这让我百思不得其解啊。请知道其中原因的大神们能给我解答!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-7 20:13:40 | 显示全部楼层
这是SD卡操作底层函数了,不存在问题才对。
建议检查其他代码。
更新不成功,具体表现是什么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

26

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-5-2
在线时间
4 小时
 楼主| 发表于 2015-5-8 11:33:51 | 显示全部楼层
 原子哥,可是其他代码断点跟踪的时候也没问题。拿20号字库为例,更新不成功具体表现在更新字库到最后剩下0xF0个字节时,即是读SD卡函数cnt=1时:
//读SD卡
//buf:数据缓存区
//sector:扇区
//cnt:扇区数
//返回值:0,ok;其他,失败.
u8 SD_ReadDisk(u8*buf,u32 sector,u8 cnt)
{
u8 r1;
if(SD_Type!=SD_TYPE_V2HC)sector <<= 9;//转换为字节地址
if(cnt==1)
{
r1=SD_SendCmd(CMD17,sector,0X01);//读命令
if(r1==0)//指令发送成功
{
r1=SD_RecvData(buf,512);//接收512个字节   
}
}else
{
r1=SD_SendCmd(CMD18,sector,0X01);//连续读命令
do
{
r1=SD_RecvData(buf,512);//接收512个字节  
buf+=512;  
}while(--cnt && r1==0);
SD_SendCmd(CMD12,0,0X01); //发送停止命令
}   
SD_DisSelect();//取消片选
return r1;//
}
其中r1=SD_RecvData(buf,512); 函数里面:
u8 SD_RecvData(u8*buf,u16 len)
{    
if(SD_GetResponse(0xFE))return 1;//等待SD卡发回数据起始令牌0xFE
    while(len--)//开始接收数据
    {
        *buf=SPI2_ReadWriteByte(0xFF);
        buf++;
    }
    //下面是2个伪CRC(dummy CRC)
    SD_SPI_ReadWriteByte(0xFF);
    SD_SPI_ReadWriteByte(0xFF);      
    return 0;//读取成功
}
等待SD卡发回数据起始令牌这里出错,得不到响应,返回1.
但是当我用我在楼上说的那个办法,在更新这最后的0xF0个字节之前,更新0xA00(5个扇区)个字节数据时,在发送停止命令时,if(cmd==CMD12) SD_SPI_ReadWriteByte(0xff);Retry=0X1F; 各设置断点,分布执行,然后就可以更新成功了。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-8 22:59:06 | 显示全部楼层
回复【3楼】648342243:
---------------------------------
你就不更新了,直接读取数据,试试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

26

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-5-2
在线时间
4 小时
 楼主| 发表于 2015-5-11 10:25:59 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
不行啊!读字库的时候显示字库不完整的,返回是0xff不是0xaa
回复

使用道具 举报

26

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-5-2
在线时间
4 小时
 楼主| 发表于 2015-5-11 10:34:48 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
还有原子哥,我的7寸屏不知怎么的突然点不亮了,我测试了下,在5V测试点测到4.15伏,在3.3V测试点测试到3.08V多,在10.0V和10.4V测到4.14V,在16V测试点测到1.86V,在-7V测到是0.4V。这是不是两个电源芯片TPS61040挂了?还是同时挂?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-12 00:28:07 | 显示全部楼层
回复【6楼】648342243:
---------------------------------
这得返修了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

26

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-5-2
在线时间
4 小时
 楼主| 发表于 2015-5-12 09:56:33 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
我猜想是TPS61040挂了,如果我自己买芯片自己修了,但是发现不是这个问题,还能不能返回去你们那帮我修?还是说直接寄回去给你们修?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-12 23:04:14 | 显示全部楼层
回复【8楼】648342243:
---------------------------------
可以的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 17:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表