硬汉嵌入式论坛

 找回密码
 立即注册
查看: 806|回复: 5
收起左侧

[有问必答] SPI访问W25Q64 流位图显示求救

[复制链接]

5

主题

12

回帖

27

积分

新手上路

积分
27
发表于 2022-6-5 18:09:56 | 显示全部楼层 |阅读模式
折腾了几天,参考论坛代码一直显示一个点,或者乱码,不知道怎么回事,有试着把位图 流信息度出来调用GUI_DrawStreamedBitmapAuto()显示正常,证明FLASH中的位图流信息是正确的,但如果直接调用 GUI_DrawStreamedBitmapExAuto()就只显示一个,不知道怎么回事,程序做了1S初始化的设置,每次显示的点颜色都不一样;
/*
*********************************************************************************************************
*    函 数 名: _ShowBMP1
*    功能说明: 显示BMP图片
*    形    参: sFilename  要读取的文件名
*    返 回 值: 无
*********************************************************************************************************
*/

#define SPIFLASHSECTOR    300
u8 bmpBuffer[SPIFLASHSECTOR];                        //读出一个sector

typedef struct
{
        u32 *fphoto;
    u32 rBMPAddressofSFlash;                //位流图在SpiFlash里的偏移地址
    u32 rSizeofBMP;                                        //位流图片总大小
    u32 rRemainSizeBMP;                                //剩余数据大小
}TypeofBitBMP;
TypeofBitBMP BitBMPBinary;

void BkWindow_init()                                //初始化图片位图流信息
{
         u32 *P=NULL;
     BitBMPBinary.fphoto=P;
     BitBMPBinary.rBMPAddressofSFlash=0;//FLASH中储存的地址为0
         BitBMPBinary.rSizeofBMP=287;
     BitBMPBinary.rRemainSizeBMP=287;
}
/*
*********************************************************************************************************
*    函 数 名: _GetData
*    功能说明: 被函数GUI_BMP_DrawEx调用
*    形    参:p             FIL类型数据
*             NumBytesReq   请求读取的字节数
*             ppData        数据指针
*             Off           如果Off = 1,那么将重新从起始位置读取                 
*    返 回 值: 返回读取的字节数
*********************************************************************************************************
*/
static int _GetDataEx(void * p,  unsigned char ** ppData, unsigned NumBytesReq, U32 Off)
{  
       
    if(NumBytesReq > SPIFLASHSECTOR)NumBytesReq = SPIFLASHSECTOR;                //请求数据过大
       
    if(Off == 1)                         BitBMPBinary.rBMPAddressofSFlash=0;
    else                                         BitBMPBinary.rBMPAddressofSFlash= Off;
       
        SPI_Read_Data(BitBMPBinary.rBMPAddressofSFlash ,bmpBuffer,NumBytesReq);
    *ppData = bmpBuffer;               

        return NumBytesReq;                                                    //返回Buffer数据大小
}

void BkWindow()                                                                                //主函数调用
{       
        u8 StreamBuf[287];
       
         GUI_DrawStreamedBitmapExAuto(_GetDataEx, (void *)&BitBMPBinary,100,30);   //只显示一个点和乱码
       
         SPI_Read_Data(0,StreamBuf,287);                                //读取FLASH 位图流数据
         GUI_DrawStreamedBitmapAuto(StreamBuf, 55, 81); //直接读取位图流信息显示正常
}

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106585
QQ
发表于 2022-6-6 11:21:43 | 显示全部楼层
加大bmpBuffer,至少要够一行的显存。别的没有什么要注意的了。
回复

使用道具 举报

5

主题

12

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2022-6-6 11:30:24 | 显示全部楼层
eric2013 发表于 2022-6-6 11:21
加大bmpBuffer,至少要够一行的显存。别的没有什么要注意的了。

我现在用来测试的是一张9*15的图片,整个流位图数据才286个字节,我的BmpBuffer 是300字节的,所以应该不是这里的问题。我有监测每次请求的数据 都是OK的,第一次请求16字节,第二次请求270字节,第三次好像Off也没有变1。 我从新初始化一次,又会重复上面的请求数据。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106585
QQ
发表于 2022-6-6 15:07:43 | 显示全部楼层
luo90049576 发表于 2022-6-6 11:30
我现在用来测试的是一张9*15的图片,整个流位图数据才286个字节,我的BmpBuffer 是300字节的,所以应该不 ...

直接将流位图转换成C数组,然后GUI_DrawStreamedBitmapExAuto的形式调用下。
回复

使用道具 举报

5

主题

12

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2022-6-6 15:20:25 | 显示全部楼层
eric2013 发表于 2022-6-6 15:07
直接将流位图转换成C数组,然后GUI_DrawStreamedBitmapExAuto的形式调用下。

我现在是用一张很小的图片做测试,我项目中实际使用的图片一张有60多KB,  所以还是需要将流位图放入FLASH后再用GUI_DrawStreamedBitmapExAuto调用, 但我有用以下函数测试过,      
SPI_Read_Data(0,StreamBuf,287);                                //读取FLASH 位图流数据
GUI_DrawStreamedBitmapAuto(StreamBuf, 55, 81);       //直接读取位图流信息显示正常
这样能正常显示,证明我的流位图数据是OK的,所以问题应该出在GETDATA() 这个函数,
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106585
QQ
发表于 2022-6-6 17:04:15 | 显示全部楼层
luo90049576 发表于 2022-6-6 15:20
我现在是用一张很小的图片做测试,我项目中实际使用的图片一张有60多KB,  所以还是需要将流位图放入FLASH ...

不要用你这个思路,就用转换成C数组,将内部Flash当外部SPI Flash读取用,看看是否正常
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-25 16:45 , Processed in 0.207385 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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