手把手一起开发SV4E-I3C设备(三)

JEDEC DDR5 SPD Hub Devices例程

为进一步方便程序开发,使用vscode开发程序,IntrospectESP_23.3.0软件调用运行,如图所示,双击UTILITY区域的PythonModule,自动生成一个py文件,可以给该模块重命名。例如重命名为SystemTestItem,在Procedure区域编辑代码SystemTestItem.run(),点击Run,即可运行SystemTestItem文件中的程序:

在这里插入图片描述

生成的py文件目录如下,此时就可以用其他python编辑器,例如vscode,进行代码开发:

在这里插入图片描述

使用vscode编辑代码,可能会出现警告信息,一般情况不需要处理,前提是保证自己的代码无误:

在这里插入图片描述

IntrospectESP API文档,IntrospectESP_23.3.0软件安装完成即可找到,快速打开方式如下:

在这里插入图片描述

IntrospectESP API文档如图所示,参考其进行程序开发即可:

在这里插入图片描述

所有例程,SV4E-I3C设备连接器件均为SPD5芯片,Reg表示MR寄存器,Mem表示NVM存储器

1、进入I3C工作模式

import dftm.svt as svt
sidebandBusController.enableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:
	 pass
 else:
 	svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()

2、退出I3C工作模式

import dftm.svt as svt
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:
	pass
else:
 	svt.printMsg('RSTDAA CCC FAIL', 'red')
sidebandBusController.enableLowBitRateMode()

3、带PEC Byte退出I3C工作模式

import dftm.svt as svt
status = sidebandBusController.doBroadcastWrite('RSTDAA', cccDefiningBytes=[0x12])
if status == True:
	pass
else:
	svt.printMsg('RSTDAA CCC FAIL', 'red')
sidebandBusController.enableLowBitRateMode()

4、I3C工作模式SPD5写MR

DIMM_HUB_SPD5_ADDR是list(),包含多个的SPD5地址,MR_REGADDR是list(),表示MR地址,如下程序是i3c模式给不同的SPD5的MR20写0x02数据:

import dftm.svt as svt
sidebandBusController.enableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:
	 pass
 else:
 	svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
for hub in range(len(DIMM_HUB_SPD5_ADDR)):
	status = sidebandBusController.spdWriteReg(DIMM_HUB_SPD5_ADDR[hub], MR_REGADDR[20], 0x02)
	if status == True:
		pass
	else:
		svt.printMsg('spdWriteReg FAIL', 'red')
		print("DIMM_HUB_SPD5_ADDR: %s MR%d_REGADDR: 0x%02X MRBYTE: 0x%02X" % (
                DIMM_HUB_SPD5_ADDR[hub], 20, MR_REGADDR[20], 0x02))
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:
	pass
else:
 	svt.printMsg('RSTDAA CCC FAIL', 'red')

5、I3C工作模式SPD5读MR

DIMM_HUB_SPD5_ADDR是list(),包含多个的SPD5地址,MR_REGADDR是list(),表示MR地址,如下程序是i3c模式读出不同的SPD5的MR28数据,并进行数据校验,校验值是0xFC:

import dftm.svt as svt
sidebandBusController.enableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:
	 pass
 else:
 	svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
for hub in range(len(DIMM_HUB_SPD5_ADDR)):
	bytesFromTarget = sidebandBusController.spdReadReg(DIMM_HUB_SPD5_ADDR[hub], MR_REGADDR[28], numBytes=1)
	if bytesFromTarget is not None and len(bytesFromTarget) > 0:
		if bytesFromTarget[0] == 0xFC:
			pass
        else:
            svt.printMsg('spdReadReg_verify FAIL', 'red')
            print("DIMM_HUB_SPD5_ADDR: %s MR%d_REGADDR: 0x%02X MRBYTE: 0x%02X" % (
                 DIMM_HUB_SPD5_ADDR[hub], 28, MR_REGADDR[28], bytesFromTarget[0]))
	else:
		svt.printMsg('spdReadReg FAIL', 'red')
		print("DIMM_HUB_SPD5_ADDR: %s MR%d_REGADDR: 0x%02X" % (
             DIMM_HUB_SPD5_ADDR[hub], 28, MR_REGADDR[28]))
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:
	pass
else:
 	svt.printMsg('RSTDAA CCC FAIL', 'red')

6、I2C工作模式SPD5读MR

DIMM_HUB_SPD5_ADDR是list(),包含多个的SPD5地址,MR_REGADDR是list(),表示MR地址,如下程序是i2c模式读出不同的SPD5的MR52数据,并进行数据校验,校验值是0x01:

import dftm.svt as svt
sidebandBusController.enableLowBitRateMode()
for hub in range(len(DIMM_HUB_SPD5_ADDR)):
	bytesFromTarget = sidebandBusController.spdLegacyReadReg(
       	DIMM_HUB_SPD5_ADDR[hub], MR_REGADDR[52], numBytes=1,twoByteAddressing=False)
	if bytesFromTarget is not None and len(bytesFromTarget) > 0:
		if bytesFromTarget[0] == 0x01:
			pass
        else:
            svt.printMsg('spdLegacyReadReg_verify FAIL', 'red')
            print("DIMM_HUB_SPD5_ADDR: %s MR%d_REGADDR: 0x%02X MRBYTE: 0x%02X" % (
                 DIMM_HUB_SPD5_ADDR[hub], 52, MR_REGADDR[52], bytesFromTarget[0]))
	else:
		svt.printMsg('spdLegacyReadReg FAIL', 'red')
		print("DIMM_HUB_SPD5_ADDR: %s MR%d_REGADDR: 0x%02X" % (
             DIMM_HUB_SPD5_ADDR[hub], 52, MR_REGADDR[52]))

7、I2C工作模式SPD5写MR

DIMM_HUB_SPD5_ADDR是list(),包含多个的SPD5地址,MR_REGADDR是list(),表示MR地址,如下程序是i2c模式给不同的SPD5的MR11写0x00数据:

import dftm.svt as svt
sidebandBusController.enableLowBitRateMode()
for hub in range(len(DIMM_HUB_SPD5_ADDR)):
	status = sidebandBusController.spdLegacyWriteReg(DIMM_HUB_SPD5_ADDR[hub], MR_REGADDR[11], 0x00, twoByteAddressing=False)
	if status == True:
		pass
	else:
		svt.printMsg('spdLegacyWriteReg FAIL', 'red')
		print("DIMM_HUB_SPD5_ADDR: %s MR%d_REGADDR: 0x%02X MRBYTE: 0x%02X" % (DIMM_HUB_SPD5_ADDR[hub], 11, MR_REGADDR[11], 0x00))

8、I3C工作模式SPD5写NVM

DIMM_HUB_SPD5_ADDR是list(),包含多个的SPD5地址,如下程序是i3c模式给不同的SPD5的NVM block0的0x00地址开始,写0x12,0x23,0x34,0x45数据:

import dftm.svt as svt
sidebandBusController.enableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:
	 pass
 else:
 	svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
for hub in range(len(DIMM_HUB_SPD5_ADDR)):
	status = sidebandBusController.spdWriteMem(DIMM_HUB_SPD5_ADDR[hub],0x00,0x00, [0x12,0x23,0x34,0x45])
	if status == True:
		pass
	else:
		svt.printMsg('spdWriteMem FAIL', 'red')
		print("DIMM_HUB_SPD5_ADDR: %s memBlock: 0x%02X memAddr: 0x%02X NVMBYTE: 0x%02X" % (DIMM_HUB_SPD5_ADDR[hub], 0, 0, 0x12))
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:
	pass
else:
 	svt.printMsg('RSTDAA CCC FAIL', 'red')

9、I3C工作模式SPD5读NVM

DIMM_HUB_SPD5_ADDR是list(),包含多个的SPD5地址,如下程序是i3c模式读不同的SPD5的NVM block0的0x00地址开始的4byte数据,并校验第一个数据是否为0x12:

import dftm.svt as svt
sidebandBusController.enableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:
	 pass
 else:
 	svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
for hub in range(len(DIMM_HUB_SPD5_ADDR)):
	bytesFromTarget = sidebandBusController.spdReadMem(DIMM_HUB_SPD5_ADDR[hub],0x00,0x00, numBytes=4)
	if bytesFromTarget is not None and len(bytesFromTarget) > 0:
		if(bytesFromTarget[0] == 0x12):
			pass
    	else:
			svt.printMsg('spdReadMem_verify FAIL', 'red')
        	print("DIMM_HUB_SPD5_ADDR: %s memBlock: 0x%02X memAddr: 0x%02X NVMBYTE: 0x%02X" % (DIMM_HUB_SPD5_ADDR[hub], 0, 0, bytesFromTarget[0]))
	else:
		svt.printMsg('spdReadMem FAIL', 'red')
        print("DIMM_HUB_SPD5_ADDR: %s memBlock: 0x%02X memAddr: 0x%02X" % (DIMM_HUB_SPD5_ADDR[hub], 0, 0))
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:
	pass
else:
 	svt.printMsg('RSTDAA CCC FAIL', 'red')

10、I3C工作模式SPD5写NVM,数据为随机数

DIMM_HUB_SPD5_ADDR是list(),包含多个的SPD5地址,如下程序是i3c模式给不同的SPD5的NVM block0的0x08地址开始,写4个随机数据:

import dftm.svt as svt
import random
def random_hex(start, stop):
    '''
    Command:    
                needs to be called
    Function:   
                Generate random numbers
    Args:       
                datas: (0,1) or (5,100) or ...
    Returns:    
                random data
    Examples:   
                >>> randomdata = random_hex(0, 63)
                >>> randomdata = random_hex(0, 255)
    Developer:  
                WHL
    '''
    random_number = random.randint(start, stop)
    random_number = hex(random_number)
    return int(random_number, 16)
sidebandBusController.enableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:
	 pass
 else:
 	svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
for hub in range(len(DIMM_HUB_SPD5_ADDR)):
	NVMBYTE0_random = random_hex(0, 255)
    NVMBYTE1_random = random_hex(0, 255)
    NVMBYTE2_random = random_hex(0, 255)
    NVMBYTE3_random = random_hex(0, 255)
    status = sidebandBusController.spdWriteMem(DIMM_HUB_SPD5_ADDR[hub],0x00,0x08, [NVMBYTE0_random,NVMBYTE1_random,NVMBYTE2_random,NVMBYTE3_random])
	if status == True:
		pass
	else:
        svt.printMsg('spdWriteMem FAIL', 'red')
        print("DIMM_HUB_SPD5_ADDR: %s memBlock: 0x%02X memAddr: 0x%02X NVMBYTE: 0x%02X" % (DIMM_HUB_SPD5_ADDR[hub], 0, 8, NVMBYTE0_random))
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:
	pass
else:
 	svt.printMsg('RSTDAA CCC FAIL', 'red')

本博文暂时分享到这里,后续博文将继续为大家呈现JEDEC DDR5 SPD Hub Devices例程

希望本文对大家有帮助,上文若有不妥之处,欢迎指正

分享决定高度,学习拉开差距

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

重学Java 16.面向对象.4.对象数组

一、对象数组 1.需求:定义一个长度为3的数组,存储3个person对象,遍历数组,将三个person对象中的属性值获取出来 public class Person {private String name;private int age;public Person(String name,int age) {this.name name…

Yii2项目使用composer异常记录

问题描述 在yii2项目中,使用require命令安装依赖时,出现如下错误提示 该提示意思是:composer运行时,执行了yiisoft/yii2-composer目录下的插件,但是该插件使用的API版本是1.0,但是当前的cmposer版本提供的…

单体工程结构

本文主要说明下单体项目的工程结构如何设计,目前业界存在两种主流的应用工程结构:一种是阿里推出的《Java开发手册》中推荐的,另外一种是基于DDD(领域驱动设计)推荐的。下面我们来看下两种工程结构是怎样的。 一、 基于阿里《Java开发手册》…

生成式 AI - Diffusion 模型的数学原理(3)

来自 论文《 Denoising Diffusion Probabilistic Model》(DDPM) 论文链接: https://arxiv.org/abs/2006.11239 Hung-yi Lee 课件整理 文章目录 一、图像生成模型本质上的共同目标二、最大似然估计三、和VAE的关联四、概率计算 一、图像生成模…

三维模型优化与可视化开发者服务

一站式服务开发者 1、极速流畅的浏览体验 无需安装插件,实现模型多端展示 最大支持100G模型,杜绝花、卡、闪 2、丰富易用的开发工具 无需掌握图形技术,实现模型轻量化和3D交互展示 提供丰富的SDK和API,简洁易用 老子云API 提供…

Java+SpringBoot:高校竞赛管理新篇章

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

添加环境变量

目录 一、前言二、目的三、添加环境变量的步骤四、检查环境变量是否配置成功 一、前言 在很多地方在下载完软件后都需要添加环境变量方可使用。这里以要在终端使用MySQL为例来说一下,在安装好MySQL8.0版本的前提下,如何添加环境变量。 二、目的 添加环…

力扣OJ题——旋转数组

题目:189.旋转数组 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数 思路一: 1.每次挪动旋转1位(用tmp将最后一位存起来,其余所有数据向后移,然后将tmp放在第一个位…

单源最短路径(Dijkstra)

前言 dijkstra:对于无负边的情况下可以达到O(nlogn)且很难被卡 最短路 - OI Wiki (oi-wiki.org) P3371 【模板】单源最短路径(弱化版) P3371 【模板】单源最短路径(弱化版) - 洛谷 | 计算机科学教育新生态 (luogu.com…

2.18学习总结

链式前向星的处理和建立 tarjan对割点和缩点的使用 拓扑排序 链式前向星: 预处理: struct edge{int from;int to;int next; }e[N]; int n,m,head[N],dfn[N],low[N],tot,color[N],num[N],out[N],s,instack[N],id; 处理: void add(int …

svg之全局组件,配合雪碧图解决vue2的svg优化问题

这里是vue2中的svg的完整解决方案的另一篇。 <template><svg :class"svgClass"><use :xlink:href"#${name}"></use></svg> </template><script>export default {name: icon,props: {name: {type: String,requi…

lv15 input子系统框架、外设驱动开发 5

一、input子系统基本框架 在我们日常的Linux系统中&#xff0c;存在大量的输入设备&#xff0c;例如按键、鼠标、键盘、触摸屏、摇杆等&#xff0c;他们本身就是字符设备&#xff0c;linux内核将这些字符设备的共同性抽象出来&#xff0c;简化驱动开发建立了一个input子系统。 …

关于Spring Boot应用系统避免因为日切(日期切换)导致请求结果变更的一种解决方案

一、前言 在系统开发过程中&#xff0c;有些业务功能面临日切&#xff08;日期切换&#xff09;问题&#xff0c;比如结息跑批问题&#xff0c;在当前工作日临近24点的时候触发结息&#xff0c;实际交易时间我们预期的是当前时间&#xff0c;但是由于业务执行耗时&#xff0c;…

【EI会议征稿通知】第五届城市工程与管理科学国际会议(ICUEMS 2024)

【Scopus稳定检索】第五届城市工程与管理科学国际会议&#xff08;ICUEMS 2024&#xff09; 2024 5th International Conference on Urban Engineering and Management Science 第五届城市工程与管理科学国际会议&#xff08;ICUEMS 2024&#xff09;将于2024年5月31日-6月2日…

告警能力中台设计与实践(三)——告警通知

一、告警消息与告警通知 1、告警消息 正如笔者在最开始所写的那样&#xff0c;第三方服务通过调用能力中台的OpenAPI实现告警发起&#xff0c;并且每一次的告警请求都会创建、归档为一条告警消息&#xff08;AlarmMsg&#xff09;。 这样的消息是无状态的&#xff0c;并且对…

Python:变量与数据类型

目录 一、变量 1.1 强数据类型与弱数据类型 1.2 全局函数 1.3 变量的命名规范 二、数据类型 2.1 基本数据类型 2.2 复合数据类型&#xff08;引用数据类型&#xff09; 三、数据类型转换 一、变量 变量&#xff1a;顾名思义&#xff0c;变化的量。在python中代指运行时…

【Java面试】MongoDB

目录 1、mongodb是什么&#xff1f;2、mongodb特点什么是NoSQL数据库&#xff1f;NoSQL和RDBMS有什么区别&#xff1f;在哪些情况下使用和不使用NoSQL数据库&#xff1f;NoSQL数据库有哪些类型?启用备份故障恢复需要多久什么是master或primary什么是secondary或slave系列文章版…

【Redis篇】详解布隆过滤器(原理 | 操作 | 代码)

文章目录 &#x1f354;简述布隆过滤器&#x1f33a;原理&#x1f6f8;存入过程&#x1f6f8;查询过程 &#x1f3f3;️‍&#x1f308;优缺点⭐优点⭐缺点 &#x1f339;代码实现&#xff08;本地&#xff09;&#x1f339;代码实现&#xff08;分布式&#xff09; &#x1f3…

Redis 集群(Cluster)

集群概念 Redis 的哨兵模式&#xff0c;提高了系统的可用性&#xff0c;但是正在用来存储数据的还是 master 和 slave 节点&#xff0c;所有的数据都需要存储在单个 master 和 salve 节点中。 如果数据量很大&#xff0c;接近超出了 master / slave 所在机器的物理内存&#…

HTTP请求报文与响应报文格式

HTTP请求报文与响应报文格式 HTTP请求报文与响应报文格式 请求报文包含四部分&#xff1a; a、请求行&#xff1a;包含请求方法、URI、HTTP版本信息b、请求首部字段c、请求内容实体d、空行 响应报文包含四部分&#xff1a; a、状态行&#xff1a;包含HTTP版本、状态码、状态码…