全志T113-S3 裸机SMHC eMMC读写问题记录

news2025/4/19 17:53:43

        由于全志的资料实在太少,很多只能通过很长时间测试才能知道问题,目前还没有实现时钟初始化,只使用了默认的24MHz时钟,测试eMMC读写过程中遇到2个问题;

问题1:读取扇区的时候,会遇到数据停止位错误,只能屏蔽掉停止位错误这个检测,并不会影响数据读取。


static bool wait_done(SMHC_CH_Type ch, smhc_data_t* pData, u32 timeout_msecs, u32 flag, bool dma)
{
	SMHC_TypeDef* pSMHCx;
	u32 status;
	u32 done = 0;

	pSMHCx = (SMHC_TypeDef*)sg_SMHCx[ch];

	if (timeout_msecs < 1) timeout_msecs = 1;
	INFO_S("SMHC: wait for flag 0x%x\r\n", flag);

	pSMHCx->RINTSTS = SMHC_RINT_END_BIT_ERROR;	//清除传输结束错误状态,传输过程中会产生传输结束位错误状态==不检查停止位问题,停止位一直会报错
	do 
	{
		status = pSMHCx->RINTSTS;
		INFO_S("pSMHCx->RINTSTS:0x%X\r\n", status);
		
		if (timeout_msecs == 0)
		{
			INFO_S("SMHC: wait timeout %x status %x flag %x\r\n", status & SMHC_RINT_INTERRUPT_ERROR_BIT, status,
				flag);
			return FALSE;
		}
		else if ((status & SMHC_RINT_INTERRUPT_ERROR_BIT))
		{
			INFO_S("SMHC: error 0x%x status 0x%x\r\n", status & SMHC_RINT_INTERRUPT_ERROR_BIT,
				status & ~SMHC_RINT_INTERRUPT_ERROR_BIT);
			return FALSE;
		}
		if (pData && dma && (pData->blkcnt * pData->blksz) > 0)
			done = ((status & flag) && (pSMHCx->IDST & SMHC_IDMAC_RECEIVE_INTERRUPT)) ? 1 : 0;
		else
			done = (status & flag);
		SYS_DelayMS(1);
		timeout_msecs--;

	} while (!done);

	/*if (pData && dma && (pData->blkcnt * pData->blksz) > 0)	//数据传输完成,检查一下 SMHC_RINT_END_BIT_ERROR 是否有错
	{
		if (pSMHCx->RINTSTS & SMHC_RINT_END_BIT_ERROR)
		{
			INFO_S("SMHC: error 0x%x 停止位错误\r\n", status & SMHC_RINT_INTERRUPT_ERROR_BIT);
			return FALSE;
		}
	}*/

	return TRUE;
}
#define SMHC_RINT_END_BIT_ERROR		  (0x1U << 15)

就是这个错误,只要读取数据就会产生,什么结束位错误标志,只能进行屏蔽或者忽略;

问题2:写数据的时候,会遇到数据CRC校验错误

意思就是写入数据的时候,卡反馈数据crc校验错误,实际测试数据能正常写入,且无校验错误,测试代码如下:

INFO_S("MMC 开始读取数据:\r\n");
	if (FALSE == SDMMC_ReadBlocks(&g_MMC_Handle, 0, Buff, 2))	//读取数据接口
	{
		ERROR_S("读取扇区失败\r\n");
	}
	else
	{
		INFO_S("MMC 读取数据成功1:\r\n");
		for (i = 0; i < 512; i++)
		{
			INFO_C("%02X ", ((u8*)Buff)[i]);
		}

		INFO_C("\r\n");


		INFO_S("MMC 读取数据成功2:\r\n");
		for (i = 0; i < 512; i++)
		{
			INFO_C("%02X ", ((u8*)Buff)[i + 512]);
		}

		INFO_C("\r\n");


		Buff[0] = 1;
		Buff[1] = 2;
		Buff[2] = 3;
		Buff[3] = 4;
		Buff[4] = 5;
		Buff[5] = 6;
		crc16 = user_crc16_modbus((u8*)Buff, 512);	//对写入的数据进行crc校验
		INFO_S("MMC写入数据校验结果:0x%X\r\n", crc16);

		if (SDMMC_WriteBlocks(&g_MMC_Handle, 0, Buff, 1) == FALSE)	//写数据接口
		{
			ERROR_S("写扇区失败\r\n");
		}
		else
		{
			INFO_S("MMC 写扇区成功\r\n");
		}

	}

	
	while (1)
	{
		Delay_MS(3000);

		memset(Buff, 0, sizeof(Buff));
		INFO_S("MMC 开始读取数据:\r\n");
		if (FALSE == SDMMC_ReadBlocks(&g_MMC_Handle, 0, Buff, 2))	//读取数据接口
		{
			ERROR_S("读取扇区失败\r\n");
		}
		else
		{
			crc16 = user_crc16_modbus((u8*)Buff, 512);	//对写入的数据进行crc校验
			INFO_S("MMC读取数据校验结果:0x%X\r\n", crc16);

			INFO_S("MMC 读取数据成功1:\r\n");
			for (i = 0; i < 512; i++)
			{
				INFO_C("%02X ", ((u8*)Buff)[i]);
			}

			INFO_C("\r\n");


			INFO_S("MMC 读取数据成功2:\r\n");
			for (i = 0; i < 512; i++)
			{
				INFO_C("%02X ", ((u8*)Buff)[i + 512]);
			}

			INFO_C("\r\n");
		}


		Delay_MS(300000000);
	}

将扇区0扇区1一起读取处理,然后将扇区0修改了几个字的数据,对待写入的数据进行CRC16校验,然后再写入到扇区0

Buff[0] = 1;
		Buff[1] = 2;
		Buff[2] = 3;
		Buff[3] = 4;
		Buff[4] = 5;
		Buff[5] = 6;
		crc16 = user_crc16_modbus((u8*)Buff, 512);	//对写入的数据进行crc校验
		INFO_S("MMC写入数据校验结果:0x%X\r\n", crc16);

		if (SDMMC_WriteBlocks(&g_MMC_Handle, 0, Buff, 1) == FALSE)	//写数据接口
		{
			ERROR_S("写扇区失败\r\n");
		}
		else
		{
			INFO_S("MMC 写扇区成功\r\n");
		}

之后再次读取数据,读取前将buff清零,确保数据是从emmc读取的,之后进行crc16校验,将读取的数据与写入之前的数据进行校验对比,确保数据一致;

crc16 = user_crc16_modbus((u8*)Buff, 512);	//对写入的数据进行crc校验
			INFO_S("MMC读取数据校验结果:0x%X\r\n", crc16);

调试信息如下:

等待后续找到问题后更新。。。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1144913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python 笔记:h5py 读取HDF5文件

1 HDF5文件 HDF5 是 Hierarchical Data Format version 5 的缩写&#xff0c;是一种用于存储和管理大量数据的文件格式一个h5py文件可以看作是 “dataset” 和 “group” 二合一的容器 dataset : 数据集&#xff0c;像 numpy 数组一样工作group : 包含了其它 dataset 和 其它 …

双11数码好物盘点、实用不踩坑的数码好物推荐

每年的双11都是买数码产品的最佳时间&#xff0c;因为很多外设产品的在双11都有很不错的降价空间&#xff0c;今天就列出几款适合双11购买的数码产品吧&#xff01; 1、不用入耳佩戴的开放式耳机 -官方售价&#xff1a;199 推荐理由&#xff1a; 要推荐的是这款健康舒适的开…

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-屏幕监控

红队专题 招募六边形战士队员[24]屏幕监控-(1)屏幕查看与控制技术的讲解图像压缩算法图像数据转换其他 [25]---屏幕监控(2)查看屏幕的实现 招募六边形战士队员 一起学习 代码审计、安全开发、web攻防、逆向等。。。 私信联系 [24]屏幕监控-(1)屏幕查看与控制技术的讲解 屏幕…

分布式锁-Redis红锁解决方案

一 分布式锁的概念 1&#xff1a;概念 分布式锁&#xff08;多服务共享锁&#xff09; 在分布式的部署环境下&#xff0c;通过锁机制来让多客户端互斥的对共享资源进行访问控制分布式系统不同进程共同访问共享资源的一种锁的实现。如果不同的系统或同一个系统的不同主机之间共…

Oracle数据库设置归档模式(超级简单)

1、打开监听 查看监听的状态&#xff0c;如果没打开监听需要打开监听&#xff0c;如果打开直接下一步 lsnrctl status 打开监听 lsnrctl start 2、启动数据库 首先进入数据库 sqlplus /nolog 然后连接管理员 conn / as sysdba 3、查看当前模式 archive log list 可以…

Spring5学习笔记—CGlib动态代理

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Spring专栏 ✨特色专栏&#xff1a; M…

Linux UWB Stack实现——FiRa会话状态机

在FiRa标准中&#xff0c;很重要的一个概念就是FiRa会话以及会话的管理&#xff0c;本文主要介绍了在Linux UWB Stack实现中&#xff0c;FiRa会话状态机管理的实现。 在FiRa中&#xff0c;会话分为INIT、DEINIT、ACTIVE、IDLE四种状态&#xff0c;其定义如下。 enum fira_sess…

2023年上半年上午易错题(软件设计师考试)

计算机中&#xff0c;系统总线用于 &#xff08;1&#xff09; 连接。 A. 接口和外设 B. 运算器、控制器和寄存器 C. CPU、主存及外设部件 D. DMA控制器和中断控制器 在由高速缓存、主存和硬盘构成的三级存储体系中&#xff0c;CPU执行指令时需要读取数据&#xff0c;那…

常用JQuery插件汇总

Jquery插件&#xff0c;数字动画特效&#xff0c;从n到m数字跳动JJ​​​​​​​CountUp.jsA javascript class that animates a numerical value by counting to it.http://inorganik.github.io/countUp.js/

pycharm 2023.2.3设置conda虚拟环境

分两步&#xff1a; &#xff08;1&#xff09;设置Virtualenv Environment &#xff08;2&#xff09;设值Conda Executable 加载conda环境&#xff0c;然后选择conda环境

系列二十三、bean的创建顺序是由什么决定的

一、bean的创建顺序是由什么决定的 bean的创建顺序是由bean的注册顺序决定的。 # 第一步&#xff1a; AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(MySpringConfig.class);# 第二步&#xff1a; refresh();# 第三步&#xff1a; fi…

绿色先行——建行江门市分行支助力补齐“三农”金融服务短板

7月的台山&#xff0c;稻谷飘香。在大耕户李胜业的农田里&#xff0c;金灿灿的稻谷翻起层层稻浪&#xff0c;收割机在稻浪里来回穿梭&#xff0c;割稻、脱粒、装车等工序一气呵成。空气中弥漫着丰收的喜悦。 夏粮迎丰收的背后&#xff0c;是中国建设银行江门市分行&#xff08;…

【计算机网络】(谢希仁第八版)第一章课后习题答案

1.计算机网络可以向用户提供哪些服务&#xff1f; 答&#xff1a;例如音频&#xff0c;视频&#xff0c;游戏等&#xff0c;但本质是提供连通性和共享这两个功能。 连通性&#xff1a;计算机网络使上网用户之间可以交换信息&#xff0c;好像这些用户的计算机都可以彼此直接连…

【机器学习可解释性】4.SHAP 值

机器学习可解释性 1.模型洞察的价值2.特征重要性排列3.部分依赖图4.SHAP 值5.SHAP 值 高级使用 正文 理解各自特征的预测结果&#xff1f; 介绍 您已经看到(并使用)了从机器学习模型中提取一般解释技术。但是&#xff0c;如果你想要打破模型对单个预测的工作原理? SHAP 值…

第三章 SysML入门|系统建模语言SysML实用指南学习

仅供个人学习记录 UML与SysML的联系 可以稍微参考UML与SysML的联系 UML&#xff08;统一建模语言&#xff09;和SysML&#xff08;系统建模语言&#xff09;是两种与建模相关的语言&#xff0c;它们之间存在联系和区别。 SysML的图分类如下图所示。 SysML 图概述 这里只…

GZ035 5G组网与运维赛题第3套

2023年全国职业院校技能大赛 GZ035 5G组网与运维赛项&#xff08;高职组&#xff09; 赛题第3套 一、竞赛须知 1.竞赛内容分布 竞赛模块1--5G公共网络规划部署与开通&#xff08;35分&#xff09; 子任务1&#xff1a;5G公共网络部署与调试&#xff08;15分&#xff09; 子…

锐捷smartWeb管理系统存在逻辑缺陷漏洞

通过弱口令进行登录 guest/guest 通过低权限用户构造payload&#xff1a; /web/xml/webuser-auth.xml访问漏洞url&#xff0c;直接获得所有账户的等级标志和base64加密的账号密码&#xff0c;解秘后即可登录后台 解密管理员的账号密码 成功登录 文笔生疏&#xff0c;措辞浅…

C++快餐——C++11(1)

文章目录 背景简介统一列表初始化{}初始化initializer_lists初始化 关键字autodecltypenullptr 范围for右值引用和移动语义左值和右值左值引用和右值引用完美转发 默认成员函数总结 背景简介 C11&#xff0c;也被称为C0x&#xff08;在它被正式标准化之前的名字&#xff09;&a…

JVM调优(10)JVM的运行时数据区

一、概述 对于 C C 来说&#xff0c;在内存管理领域&#xff0c;JVM既拥有最高的权利&#xff0c;但是同时他们又是从事最基础工作的劳动人员&#xff0c;因为他们担负着每一个对象从开始到结束的维护责任。而对于Java来说&#xff0c;再虚拟机自动内存管理的帮助下&#xff0…

Proteus仿真--花样流水灯(仿真文件+程序)

本文主要介绍基于51单片机的花样流水灯仿真&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真运行视频 Proteus仿真--花样流水灯&#xff08;仿真文件程序&#xff09; 附完整Proteus仿真资料代码资料 链接: https://pan.baidu.com/s/1coEEBQcTQSzWQiSH_nNiUQ?pw…