二、软件部分

软件中INI_FLAG为设置的一个标志位,通过置1该位可以控制发送或接受数据速度。因为在初始化阶段SD卡操作需要适当放缓,而初始化成功后可以加快数据传动速率。

1>往SD卡写一个字节

void SD_WRITE(unsigned char daima)  //往SD写一个字节
{unsigned char i;
for(i=0;i<8;i++)
{
SD_CLK=0;
if(INI_FLAG)delayNOP();
SD_DI=(daima&0x80)>>7;//注意先发送高位
SD_CLK=1;
if(INI_FLAG)delayNOP();
daima<<=1;
}
SD_DI=1;
}

2>从SD读一个字节

unsigned char SD_READ()//从SD读一个字节
{unsigned char n=0,i;
SD_DO=1;//将单片机引脚接口读打开
for(i=0;i<8;i++)
{
n<<=1;//先接受高位
SD_CLK=0;
if(INI_FLAG)delayNOP();
SD_CLK=1;
if(INI_FLAG)delayNOP();
if(SD_DO)n|=1;
}
return n;
}

3>延时函数

void delayNOP()
{
  _nop_();//需要在头文件中加入#include <intrins.h>
  _nop_();
  _nop_();
  _nop_();
}

4>写入一个完整指令

unsigned char SD_CMD(unsigned char command,unsigned long address,unsigned char crc)//往SD写完整命令
{unsigned char argument1,argument2,argument3,argument4,i,temp;
SD_CS=1;
SD_WRITE(0xFF);//在命令结束后可以加入8个时钟,在写下个命令时就能实现此效果
SD_CS=0;
argument4=address;
argument3=(unsigned char)(address>>8);
argument2=(unsigned char)(address>>16);
argument1=(unsigned char)(address>>24);
SD_WRITE(command);
SD_WRITE(argument1);
SD_WRITE(argument2);
SD_WRITE(argument3);
SD_WRITE(argument4);
SD_WRITE(crc);
SD_READ();
do
{ i++;
temp=SD_READ();
}while((temp==0XFF)&&(i<100));

*******************************************************************************************************************(1)
return(temp);
}

5>RESET 命令

unsigned char SD_RST()//SD 卡复位,进入SPI 模式,使用
{
unsigned char i,time,temp;
TP_CS=1;******************************************************************************************************(2)
INI_FLAG=1; //将INI_FLAG 置为1,以减慢读写速度
SD_CS=1;    //设置起始状态**********************************************************************************(3)
SD_CLK=1;  //设置起始状态
SD_DO =1;  //设置起始状态
delayms(4);
for(i=0;i<0x0f;i++)
{//复位时,首先要发送最少74 个时钟信号,提高系统运行稳定性
SD_WRITE(0xff);//120 个时钟
}
time=0;
do
{
temp=SD_CMD(0x40,0,0x95);//写入CMD0
time++;
if(time>=200)
{
SD_CS=1; //关闭片选
RSTshibai=0;//测试RESET 命令写入失败标志
return(0x22);//CMD0 写入失败
}
}while(temp!=0x01);
RSTchenggong=0;//测试RESET 命令写入成功标志
return 0;//
}

****************************************************************************************************************

详情请咨询:shop108408772.taobao.com

****************************************************************************************************************

6>INI指令

unsigned char SD_INI() //初始化,使用CMD1(命令1)
{
unsigned char temp;
unsigned char i;
do
{
                             //CMD1命令
         temp=SD_CMD(0x41,0,0xFF);    //发送CMD1进行激活
       i++;
       if(i >= 200)
       {INIshibai=0;//测试INI 命令写入失败标志
         return(0x33);      
       }
}while(temp!=0);
INI_FLAG=0;//初始化完毕,将INI_FLAG设置为0,为了提高以后的数据传输速度
INIchenggong=0; //测试INI 命令写入失败标志
SD_CS=1; //关闭片选
return(0); //返回0,说明初始化操作成功
}

7>读数据块命令

unsigned char SD_Read_Sector(unsigned char picture[512])//从SD 卡的指定扇区中读出512 个字节,使用CMD17(17 号命令)
{
unsigned int j;
unsigned char time;
SD_CS=0;//打开片选
time=0;
delayms(100);
for(j=0;j<512;j++) 
{
picture[j]=SD_READ();//将数据写入到数组里
for(time=0;time<=5;time++);
}
SD_READ();
SD_READ();//读取两个字节的CRC 校验码,不用关心它们
SD_CS=1; //SD 卡关闭片选
SD_WRITE(0xFF);//按照SD 卡的操作时序在这里补8 个时钟
return 0;
}

*****************************************************************************************************************

详情请咨询:shop108408772.taobao.com

******************************************************************************************************************

8>主程序

void main()
{
unsigned long address32;
unsigned int i,j;
unsigned char temp,time,xdata doushi[512],start,stop;
unsigned int temp16,interchange;
LCD_INITIALIZE();//LCD初始化
delayms(3);
LCD_CLEAN();//LCD清屏
delayms(3);
SD_RST();//SD卡CMD0命令写入
SD_INI();//SD卡CMD1命令写入,完成SD卡初始化操作
LCD_WINDOWADDRESS(0x00,0xef,0x00,0x18f);//设定窗函数
for(j=0;j<=375;j++)
{
do
{ //addr=addr*512 将块地址(扇区地址)转为字节地址
if(j<=127)address32=0x41f000+512*j;************************************************************************(4)
else if(j<=255)address32=0x42f000+512*(j-128);
else address32=0x43f000+512*(j-256);
temp=SD_CMD(0x51,address32,0xFF); //写入CMD17
time++;
if(time>=100)
{
duqushibai1=0; //读块失败
}
}while(temp!=0); //返回值为0 才正确
while(SD_READ()!=0xFE)
{  
time++;
if(time>=100)duqushibai2=0;
}; //一直读,当读到0xfe 时,说明后面的是512 字节的数据了
SD_Read_Sector(doushi);
start=0;
stop=255;
if(j==0)start=27;***********************************************************************************************(5)
if(j==375)stop=26;
  for(i=start;i<=stop;i++)
  {
   temp16=0;
   temp16=temp16|doushi[2*i+1];*****************************************************************************(6)
   temp16=temp16<<8;
   temp16=temp16|doushi[2*i];
   interchange=temp16<<1;
   interchange=(interchange&0xffe0)|(temp16&0x1f);
  LCD_WRITEDATA16(interchange);*************************************************************************(7)
  } 
}
while(1);
//LCD_CHAR(hao,0xF800,0XFFFF);
}

三、调试中遇到的问题

在位置(1)处,注意不要使CS=0,否则,使用读块数据时,数据无法读取。

在位置(2)处,因为我所使用的是插在TFT彩屏上的SD卡,它还集成了触摸屏功能,而触摸屏与SD卡共用数据和时钟接口,此位必须置1,否则操作失败。

在位置(3)处,设置初始化状态,减少出错

在位置(4)处,由于单片机只能运算小于等于0xffff的数据,防止溢出处理方法,否则不能正确读取全屏数据。图片起始地址为物理地址,不是逻辑地址。

在位置(5)处,由于BMP文件中前54字节为文件基本信息参数,实际数据从第55字节开始

在位置(6)处,BMP文件为低位在前,高位在后,注意这个特点,否则不能正常显示

在位置(7)处,注意LCD送像素数据时时一次送2字节,数组中的块数据需要组装成2字节才能送往TFT.

四、测试结果

********************************************************************************************************************************

详情请咨询:shop108408772.taobao.com

*******************************************************************************************************************************

单片机读取SD卡中BMP图片文件并送往TFT彩屏上显示(测试成功)(二)相关推荐

  1. android 读取sd卡中的图片

    一.获取读取SD卡的权限 <!--在SDCard中创建与删除文件权限 --><uses-permission android:name="android.permissio ...

  2. ZYNQ系列之-----SD卡中BMP图片读取+ddr读写验证

    1.前提: sd卡挂载在ps测,并且使用的ZYNQ系统.和前文是一样的. ZYNQ系列之-----SD卡读写文件_hhh_fpga的博客-CSDN博客 2.设备与软件 软件: vivado 2021. ...

  3. android编程读取sd卡txt文件,如何读取SD卡中的txt文件?

    我有一个自定义ListView,代码如下.而不是写作: "http://yoursite.com/image1.png","http://yoursite.com/ima ...

  4. bmp文件头_「正点原子FPGA连载」第十九章SD卡读BMP图片LCD显示

    1)摘自[正点原子]领航者 ZYNQ 之嵌入式开发指南 2)实验平台:正点原子领航者ZYNQ开发板 3)平台购买地址:https://item.taobao.com/item.htm?&id= ...

  5. activiti高亮显示图片_【正点原子FPGA连载】第二十章SD卡读BMP图片HDMI显示实验领航者 ZYNQ 之嵌入式开发指南...

    1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...

  6. 手机sd卡中的图片误删?Mac数码相机中的照片丢失?

    手机sd卡中的图片误删?Mac数码相机中的照片丢失?PHOTORECOVERY Professional 2019 Mac是一款专业的图片数据恢复软件,主要用于恢复数码相机以及手机sd卡中误删除的图片 ...

  7. 计算机中硬盘上删了的东西为什么还可以恢复sd卡可以吗,怎么从SD卡中恢复误删文件...

    怎么从SD卡中恢复误删文件?SD卡广泛用于各种便携式设备,如数码相机,手机和多媒体播放器.虽然它给用户带来了极大的便利,但是因为SD卡空间有限,这就要求你总是你删除旧的数据写入新的数据,这导致您的数据 ...

  8. sd卡有多个android文件夹,android - 如何adb拉出SD卡中存在的文件夹的所有文件

    android - 如何adb拉出SD卡中存在的文件夹的所有文件 我的SD卡中有一个文件夹:/mnt/sdcard/Folder1/Folder2/Folder3/*.jpg Folder1和Fold ...

  9. 获取SD卡中的音乐文件

    小编近期在搞一个音乐播放器App.练练手: 首先遇到一个问题.怎么获取本地的音乐文件? /*** 获取SD卡中的音乐文件** @param context* @return*/public stati ...

最新文章

  1. JavaScript初学者编程题(2)
  2. 并查集/poj1182 noi2001食物链eat
  3. 土地利用结构信息熵_科研成果快报第163期:基于市政用水时序数据的城市混合土地利用感知与分析...
  4. 如何在Eclipse中显示行号
  5. 10个我最喜欢问程序员的面试问题
  6. 【开源框架】:解决方案级别的代码生成器 WebFirst
  7. 5种设置ASP.NET Core应用程序URL的方法
  8. imagick php 缩放,php使用imagick模块实现图片缩放、裁剪、压缩示例
  9. ps3无线无法与服务器通信,psp上网出现无法与服务器通信(8001006F)
  10. php注册树模式,PHP设计模式之注册树模式
  11. posix,perl正则表达式区别
  12. java 读取mysql数据_使用java从mysql数据库读取数据
  13. python车牌识别系统开源代码_TensorFlow车牌识别完整版代码(含车牌数据集)
  14. 从jensen不等式到相对熵的非负性性
  15. 单片机原理及应用 张鑫_单片机原理及应用_课后答案(张鑫)版.doc
  16. modelica练习
  17. 计算机是如何储存信息的,计算机是如何储存信息的
  18. 浙江大学计算机保研条件_2020年计算机系保研推免记录(浙江大学软件学院)...
  19. RFID固定资产盘点的解决方案
  20. 甲骨文称将出示李艾科犯罪证据 与惠普较劲

热门文章

  1. Edge, IE11修改cookie
  2. 对于支付公司的长短款概念、产生原因及测试方法
  3. OpenCV 视频流格式----avi与mp4区别
  4. 计算机专业硕士论文评语,硕士论文答辩导师评语
  5. 基于Android的天气预报系统的设计与实现
  6. 天气预报 API - 空气指数
  7. stm32为什么运行不了linux,stm32用ucos还是linux
  8. xbox手柄适配器驱动_从提示框:两个屏幕上的Xbox输出,高科技的万圣节道具和旧的闪存驱动器作为密码重置磁盘...
  9. 马云的第三次创业:悄然布局三大帝国
  10. 解决springboot + quartz的分布式问题以及dolphinscheduler