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

news2025/1/27 13:05:24

JEDEC DDR5 SPD Hub Devices例程

DDR5生态系统的核心是SidebandBus Protocol

参考下图,可以将SV4E-I3C的端口1声明为主服务器(模拟主机控制器),并且它可以属于SV4E-I3C上的一个总线。端口2可以作为SPD Hub DUT的Local Bus侧的从站连接。这个从站可以被编程来模拟,端口2属于SV4E-I3C上的第二个总线,并且独立于端口1进行编程。SV4E-I3C的端口3和4也可以连接到SPD集线器的本地总线侧,它们可以用来模拟PMIC和/或RCD设备。这些端口属于SV4E-I3C上的同一第二条总线。这些端口的可用性为SPD Hub执行地址修改等功能提供了完整的覆盖范围。

在这里插入图片描述
图片来源《EN-W002E-E-21090-Component-Validation-of-JEDEC-DDR5-SPD-Hub-Devices》

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

1、I2C模式读Reg

SV4E-I3C设备在i2c模式下读SPD5的Reg(MR寄存器),Python代码如下:

i3cDataCapture.start()
sidebandBusController.setup()
regAddr = 0x00
byte_num = 64
sidebandBusController.enableLowBitRateMode()
bytesFromTarget = sidebandBusController.spdLegacyReadReg('DIMM0-SPD', regAddr, numBytes = byte_num, twoByteAddressing=False)
for value in range(int(regAddr),int(byte_num+regAddr)):
	print("regAddr: 0x%02X mrbyte: 0x%02X" % (value, bytesFromTarget[(value-(int(regAddr)))]))
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,如图,LOG区域已经打印运行结果:

在这里插入图片描述
打开生成的波形结果,如图:

在这里插入图片描述

2、I3C模式读Reg

SV4E-I3C设备在i3c模式下读SPD5的Reg(MR寄存器),Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
regAddr = 0x00
byte_num = 64
sidebandBusController.enableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:
	svt.printMsg('SETAASA CCC PASS', 'green')
else:
	svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
bytesFromTarget = sidebandBusController.spdReadReg('DIMM0-SPD', regAddr, numBytes = byte_num)
for value in range(int(regAddr),int(byte_num+regAddr)):
	print("regAddr: 0x%02X mrbyte: 0x%02X" % (value, bytesFromTarget[(value-(int(regAddr)))]))
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:
	svt.printMsg('RSTDAA CCC PASS', 'green')
else:
	svt.printMsg('RSTDAA CCC FAIL', 'red')
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,LOG区域已经打印运行结果,如图所示:

在这里插入图片描述
打开生成的波形结果,如图:

在这里插入图片描述

3、使能ENEC+获取器件状态

3、4、5部分的工作主要是测试SV4E-I3C设备的PEC注错功能,PEC注错方式有多种,这里仅对sidebandBusController.startPecErrorInjection()进行测试,首先使能ENEC,但是pecEnable为False(如图sidebandBusController部分的参数设置),Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
sidebandBusController.initializeBus()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:
	svt.printMsg('SETAASA CCC PASS', 'green')
else:
	svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('ENEC', cccDefiningBytes = [0x01])
if status == True:
	svt.printMsg('ENEC CCC PASS', 'green')
else:
	svt.printMsg('ENEC CCC FAIL', 'red')
targetAddr = 'DIMM0-SPD'
regAddr = 0x0C
dataByte = 0x01 # one byte
status = sidebandBusController.spdWriteReg(targetAddr, regAddr, dataByte)
if status == True:
	svt.printMsg('spdWriteReg PASS', 'green')
else:
	svt.printMsg('spdWriteReg FAIL', 'red')
statusTuple = sidebandBusController.getTargetStatus('DIMM0-SPD')
if statusTuple is not None:
    (pecErr, protocolErr, pendingInterrupt) = statusTuple
	print("pecErr: 0x%02X protocolErr: 0x%02X pendingInterrupt: 0x%02X" % (pecErr, protocolErr, pendingInterrupt))
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:
	svt.printMsg('RSTDAA CCC PASS', 'green')
else:
	svt.printMsg('RSTDAA CCC FAIL', 'red')    
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,如图:

在这里插入图片描述
打开生成的波形结果,如图:

在这里插入图片描述

4、使能ENEC+使能PEC+获取器件状态

接下来,pecEnable为True(如图sidebandBusController部分的参数设置),Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
sidebandBusController.initializeBus()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:
	svt.printMsg('SETAASA CCC PASS', 'green')
else:
	svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('ENEC', cccDefiningBytes = [0x01])
if status == True:
	svt.printMsg('ENEC CCC PASS', 'green')
else:
	svt.printMsg('ENEC CCC FAIL', 'red')
targetAddr = 'DIMM0-SPD'
regAddr = 0x0C
dataByte = 0x01 # one byte
status = sidebandBusController.spdWriteReg(targetAddr, regAddr, dataByte)
if status == True:
	svt.printMsg('spdWriteReg PASS', 'green')
else:
	svt.printMsg('spdWriteReg FAIL', 'red')
statusTuple = sidebandBusController.getTargetStatus('DIMM0-SPD')
if statusTuple is not None:
    (pecErr, protocolErr, pendingInterrupt) = statusTuple
	print("pecErr: 0x%02X protocolErr: 0x%02X pendingInterrupt: 0x%02X" % (pecErr, protocolErr, pendingInterrupt))
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:
	svt.printMsg('RSTDAA CCC PASS', 'green')
else:
	svt.printMsg('RSTDAA CCC FAIL', 'red')    
i3cDataCapture.stop()

代码没有改变,点击Run运行,如图:

在这里插入图片描述
打开生成的波形结果,对比与刚刚生成的结果,由于使能PEC,故结果中包含pec byte:

在这里插入图片描述

5、使能ENEC+使能PEC+注入PEC错误+获取器件状态

然后开始注入PEC error,Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
sidebandBusController.initializeBus()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:
	svt.printMsg('SETAASA CCC PASS', 'green')
else:
	svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('ENEC', cccDefiningBytes = [0x01])
if status == True:
	svt.printMsg('ENEC CCC PASS', 'green')
else:
	svt.printMsg('ENEC CCC FAIL', 'red')
sidebandBusController.startPecErrorInjection()
targetAddr = 'DIMM0-SPD'
regAddr = 0x0C
dataByte = 0x01 # one byte
status = sidebandBusController.spdWriteReg(targetAddr, regAddr, dataByte)
if status == True:
	svt.printMsg('spdWriteReg PASS', 'green')
else:
	svt.printMsg('spdWriteReg FAIL', 'red')
sidebandBusController.stopPecErrorInjection()
statusTuple = sidebandBusController.getTargetStatus('DIMM0-SPD')
if statusTuple is not None:
    (pecErr, protocolErr, pendingInterrupt) = statusTuple
	print("pecErr: 0x%02X protocolErr: 0x%02X pendingInterrupt: 0x%02X" % (pecErr, protocolErr, pendingInterrupt))
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:
	svt.printMsg('RSTDAA CCC PASS', 'green')
else:
	svt.printMsg('RSTDAA CCC FAIL', 'red')    
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,如图,LOG区域已经打印运行结果:

在这里插入图片描述
打开生成的波形结果,如图,在写Reg时注入错误的PEC byte:

在这里插入图片描述
ibi payload自动完成,如图所示:

在这里插入图片描述

6、使能ENEC+未注入parity错误+获取器件状态

6、7部分的工作主要是测试SV4E-I3C设备的parity注错功能,这里对sidebandBusController.startErrorInjection(errorSpecs)进行测试,首先是未进行parity注错,Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
sidebandBusController.enableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:
	svt.printMsg('SETAASA CCC PASS', 'green')
else:
	svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('ENEC', cccDefiningBytes = [0x01])
if status == True:
	svt.printMsg('ENEC CCC PASS', 'green')
else:
	svt.printMsg('ENEC CCC FAIL', 'red')
bytesFromTarget = sidebandBusController.spdWriteReg('DIMM0-SPD', 0x00,0x00)
statusTuple = sidebandBusController.getTargetStatus('DIMM0-SPD')
if statusTuple is not None:
    (pecErr, protocolErr, pendingInterrupt) = statusTuple
	print("pecErr: 0x%02X protocolErr: 0x%02X pendingInterrupt: 0x%02X" % (pecErr, protocolErr, pendingInterrupt))
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:
	svt.printMsg('RSTDAA CCC PASS', 'green')
else:
	svt.printMsg('RSTDAA CCC FAIL', 'red')
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,如图,LOG区域已经打印运行结果:

在这里插入图片描述
打开生成的波形结果,如图:

在这里插入图片描述

7、使能ENEC+注入parity错误+获取器件状态

注入parity错误,Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
sidebandBusController.enableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:
	svt.printMsg('SETAASA CCC PASS', 'green')
else:
	svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('ENEC', cccDefiningBytes = [0x01])
if status == True:
	svt.printMsg('ENEC CCC PASS', 'green')
else:
	svt.printMsg('ENEC CCC FAIL', 'red')
errorSpecs = [ (2, 3) ]
sidebandBusController.startErrorInjection(errorSpecs)
bytesFromTarget = sidebandBusController.spdWriteReg('DIMM0-SPD', 0x00,0x00)
sidebandBusController.stopErrorInjection()
statusTuple = sidebandBusController.getTargetStatus('DIMM0-SPD')
if statusTuple is not None:
    (pecErr, protocolErr, pendingInterrupt) = statusTuple
	print("pecErr: 0x%02X protocolErr: 0x%02X pendingInterrupt: 0x%02X" % (pecErr, protocolErr, pendingInterrupt))
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:
	svt.printMsg('RSTDAA CCC PASS', 'green')
else:
	svt.printMsg('RSTDAA CCC FAIL', 'red')
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,如图:

在这里插入图片描述
打开生成的波形结果,如图,写Reg注入parity error,ibi payload自动完成:

在这里插入图片描述

8、使能ENEC+注入parity错误+读Reg+ibiResponse(ackAndDisable)+获取器件状态

8、9部分的工作主要是测试SV4E-I3C设备的ibiResponse设置,首先controllerParams部分ibiResponse设置为ackAndDisable,Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
sidebandBusController.enableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:
	svt.printMsg('SETAASA CCC PASS', 'green')
else:
	svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('ENEC', cccDefiningBytes = [0x01])
if status == True:
	svt.printMsg('ENEC CCC PASS', 'green')
else:
	svt.printMsg('ENEC CCC FAIL', 'red')
errorSpecs = [ (2, 3) ]
sidebandBusController.startErrorInjection(errorSpecs)
bytesFromTarget = sidebandBusController.spdWriteReg('DIMM0-SPD', 0x00,0x00)
sidebandBusController.stopErrorInjection()
bytesFromTarget = sidebandBusController.spdReadReg('DIMM0-SPD', 0x30, numBytes = 5)
for value in range(int(0x30),int(5+0x30)):
	print("regAddr: 0x%02X mrbyte: 0x%02X" % (value, bytesFromTarget[(value-(int(0x30)))]))
statusTuple = sidebandBusController.getTargetStatus('DIMM0-SPD')
if statusTuple is not None:
    (pecErr, protocolErr, pendingInterrupt) = statusTuple
	print("pecErr: 0x%02X protocolErr: 0x%02X pendingInterrupt: 0x%02X" % (pecErr, protocolErr, pendingInterrupt))
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:
	svt.printMsg('RSTDAA CCC PASS', 'green')
else:
	svt.printMsg('RSTDAA CCC FAIL', 'red')
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,如图,LOG区域已经打印运行结果:

在这里插入图片描述
打开生成的波形结果,如图,注意与下个波形结果进行对比:

在这里插入图片描述

9、使能ENEC+注入parity错误+读Reg+ibiResponse(ackAndProceed)+获取器件状态

controllerParams部分ibiResponse设置为ackAndProceed,Python代码未改变,如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
sidebandBusController.enableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:
	svt.printMsg('SETAASA CCC PASS', 'green')
else:
	svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('ENEC', cccDefiningBytes = [0x01])
if status == True:
	svt.printMsg('ENEC CCC PASS', 'green')
else:
	svt.printMsg('ENEC CCC FAIL', 'red')
errorSpecs = [ (2, 3) ]
sidebandBusController.startErrorInjection(errorSpecs)
bytesFromTarget = sidebandBusController.spdWriteReg('DIMM0-SPD', 0x00,0x00)
sidebandBusController.stopErrorInjection()
bytesFromTarget = sidebandBusController.spdReadReg('DIMM0-SPD', 0x30, numBytes = 5)
for value in range(int(0x30),int(5+0x30)):
	print("regAddr: 0x%02X mrbyte: 0x%02X" % (value, bytesFromTarget[(value-(int(0x30)))]))
statusTuple = sidebandBusController.getTargetStatus('DIMM0-SPD')
if statusTuple is not None:
    (pecErr, protocolErr, pendingInterrupt) = statusTuple
	print("pecErr: 0x%02X protocolErr: 0x%02X pendingInterrupt: 0x%02X" % (pecErr, protocolErr, pendingInterrupt))
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:
	svt.printMsg('RSTDAA CCC PASS', 'green')
else:
	svt.printMsg('RSTDAA CCC FAIL', 'red')
i3cDataCapture.stop()

点击Run运行,如图:

在这里插入图片描述
打开生成的波形结果,如图:

在这里插入图片描述

10、I2C模式写Reg

SV4E-I3C设备在i2c模式下写SPD5的Reg(MR寄存器),Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
regAddr = 0x00
dataByte = 0x00
sidebandBusController.enableLowBitRateMode()
status = sidebandBusController.spdLegacyWriteReg('DIMM0-SPD', regAddr, dataByte, twoByteAddressing=False)
if status == True:
	svt.printMsg('spdLegacyWriteReg PASS', 'green')
else:
	svt.printMsg('spdLegacyWriteReg FAIL', 'red')
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,如图:

在这里插入图片描述
打开生成的波形结果,如图:

在这里插入图片描述

11、I2C模式写Mem

SV4E-I3C设备在i2c模式下写SPD5的Mem(NVM寄存器),Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
sidebandBusController.enableLowBitRateMode()
memBlock = 0x00
data16Bytes = []
for datanum in range(16):
    data16Bytes.append(0xFF)
for block in range(16):
    for addr in range(4):
        status = sidebandBusController.spdLegacyWriteMem('DIMM0-SPD', memBlock, 0x00, data16Bytes)
        if status == True:
			print("memBlock: %d  write 0x%02X PASS" % (block,data16Bytes[0]))
        else:
			print("memBlock: %d  write 0x%02X FAIL" % (block,data16Bytes[0]))
memBlock = memBlock + 1
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,如图,LOG区域已经打印运行结果:

在这里插入图片描述
打开生成的波形结果,如图:

在这里插入图片描述

12、I2C模式读Mem

SV4E-I3C设备在i2c模式下读SPD5的Mem(NVM寄存器),Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
sidebandBusController.enableLowBitRateMode()
memBlock = 0x00
for block in range(16):
bytesFromTarget = sidebandBusController.spdLegacyReadMem('DIMM0-SPD', memBlock, 0x00, numBytes = 64, twoByteAddressing=False)
    for value in range(64):
		print("memBlock: %d memAddr: 0x%02X mrbyte: 0x%02X" % (block, value, bytesFromTarget[value]))
memBlock = memBlock + 1
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,如图,LOG区域已经打印运行结果:

在这里插入图片描述

打开生成的波形结果,如图:

在这里插入图片描述

13、I3C模式读Reg

SV4E-I3C设备在i3c模式下读SPD5的Reg(MR寄存器),Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
regAddr = 0x00
byte_num = 64
sidebandBusController.enableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:
	svt.printMsg('SETAASA CCC PASS', 'green')
else:
	svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
bytesFromTarget = sidebandBusController.spdReadReg('DIMM0-SPD', regAddr, numBytes = byte_num)
for value in range(int(regAddr),int(byte_num+regAddr)):
	print("regAddr: 0x%02X mrbyte: 0x%02X" % (value, bytesFromTarget[(value-(int(regAddr)))]))
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:
	svt.printMsg('RSTDAA CCC PASS', 'green')
else:
	svt.printMsg('RSTDAA CCC FAIL', 'red')
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,如图,LOG区域已经打印运行结果:

在这里插入图片描述
打开生成的波形结果,如图:

在这里插入图片描述

14、I3C模式写Reg

SV4E-I3C设备在i3c模式下写SPD5的Reg(MR寄存器),Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
sidebandBusController.enableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:
	svt.printMsg('SETAASA CCC PASS', 'green')
else:
	svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
regAddr = 0x00
dataByte = 0x00
status = sidebandBusController.spdWriteReg('DIMM0-SPD', regAddr, dataByte)
if status == True:
	svt.printMsg('spdWriteReg PASS', 'green')
else:
	svt.printMsg('spdWriteReg FAIL', 'red')
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:
	svt.printMsg('RSTDAA CCC PASS', 'green')
else:
	svt.printMsg('RSTDAA CCC FAIL', 'red')
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,如图,LOG区域已经打印运行结果:

在这里插入图片描述

打开生成的波形结果,如图:

在这里插入图片描述

15、I3C模式写Mem

SV4E-I3C设备在i3c模式下写SPD5的Mem(NVM寄存器),Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
sidebandBusController.enableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:
	svt.printMsg('SETAASA CCC PASS', 'green')
else:
	svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
memBlock = 0x00
data16Bytes = []
for datanum in range(16):
    data16Bytes.append(0xFF)
for block in range(16):
    for addr in range(4):
        status = sidebandBusController.spdWriteMem('DIMM0-SPD', memBlock, 0x00, data16Bytes)
        if status == True:
			print("memBlock: %d  write 0x%02X PASS" % (block,data16Bytes[0]))
        else:
			print("memBlock: %d  write 0x%02X FAIL" % (block,data16Bytes[0]))
memBlock = memBlock + 1
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:
	svt.printMsg('RSTDAA CCC PASS', 'green')
else:
	svt.printMsg('RSTDAA CCC FAIL', 'red')
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,如图,LOG区域已经打印运行结果:

在这里插入图片描述

打开生成的波形结果,如图:

在这里插入图片描述

16、I3C模式读Mem

SV4E-I3C设备在i3c模式下读SPD5的Mem(NVM寄存器),Python代码如下:

import dftm.svt as svt
i3cDataCapture.start()
sidebandBusController.setup()
sidebandBusController.enableLowBitRateMode()
status = sidebandBusController.doBroadcastWrite('SETAASA')
if status == True:
svt.printMsg('SETAASA CCC PASS', 'green')
else:
svt.printMsg('SETAASA CCC FAIL', 'red')
sidebandBusController.disableLowBitRateMode()
memBlock = 0x00
for block in range(16):
bytesFromTarget = sidebandBusController.spdReadMem('DIMM0-SPD', memBlock, 0x00, numBytes = 64)
    for value in range(64):
print("memBlock: %d memAddr: 0x%02X mrbyte: 0x%02X" % (block, value, bytesFromTarget[value]))
memBlock = memBlock + 1
status = sidebandBusController.doBroadcastWrite('RSTDAA')
if status == True:
svt.printMsg('RSTDAA CCC PASS', 'green')
else:
svt.printMsg('RSTDAA CCC FAIL', 'red')
i3cDataCapture.stop()

Procedure区域编辑代码,点击Run运行,如图,LOG区域已经打印运行结果:

在这里插入图片描述

打开生成的波形结果,如图:

在这里插入图片描述
上述程序可能存在少量错误和可优化的地方,后续博文将进行修改和优化

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

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

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

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

相关文章

JWT和base64

1.1 jwt和token 1.1.1 token介绍 令牌(Token):在计算机领域,令牌是一种代表某种访问权限或身份认证信息的令牌。它可以是一串随机生成的字符或数字,用于验证用户的身份或授权用户对特定资源的访问。 简单理解 : 每个…

【解决(几乎)任何机器学习问题】:处理分类变量篇(上篇)

这篇文章相当长,您可以添加至收藏夹,以便在后续有空时候悠闲地阅读。 本章因太长所以分为上下篇来上传,请敬请期待 很多⼈在处理分类变量时都会遇到很多困难,因此这值得⽤整整⼀章的篇幅来讨论。在本章中,我将 讲述不同…

H5028B 车灯舞台灯 PWM调光 可温控 48V 60V 72V 80V 100V降压芯片

带温控功能的降压恒流芯片的工作原理如下: 降压功能:首先,芯片会监测输入电压,并通过内部的电路将输入电压降低到所需的输出电压水平。这可以通过开关电源转换技术实现,例如脉冲宽度调制(PWM)或…

2024年【熔化焊接与热切割】考试题库及熔化焊接与热切割考试报名

题库来源:安全生产模拟考试一点通公众号小程序 熔化焊接与热切割考试题库考前必练!安全生产模拟考试一点通每个月更新熔化焊接与热切割考试报名题目及答案!多做几遍,其实通过熔化焊接与热切割模拟考试题库很简单。 1、【单选题】…

硬错误-STM32

需要修改栈大小 还得是野火的文档比较讲得深一点。

图解linux零拷贝技术

转发自:https://zhuanlan.zhihu.com/p/442771856 1、数据拷贝基础过程 在Linux系统内部缓存和内存容量都是有限的,更多的数据都是存储在磁盘中。对于Web服务器来说,经常需要从磁盘中读取数据到内存,然后再通过网卡传输给用户&am…

第13章 网络 Page741~744 asio核心类 ip::tcp::socket

1. ip::tcp::socket liburl库使用"curl*" 代表socket 句柄 asio库使用ip::tcp::socket类代表TCP协议下的socket对象。 将“句柄”换成“对象”,因为asio库是不打折扣的C库 ip::tcp::socket提供一下常用异步操作都以async开头 表13-3 tcp::socket提供的异步操作 …

ElementUI Form:Cascader 级联选择器

ElementUI安装与使用指南 Cascader 级联选择器 点击下载learnelementuispringboot项目源码 效果图 el-cascader.vue&#xff08;Cascader 级联选择器&#xff09;页面效果图 项目里el-cascader.vue代码 <script> let id 0; export default {name: el_cascader,dat…

根据Ruoyi做二开

Ruoyi二开 前言菜单代码生成新建微服务网关添加微服务的路由 vue页面和对应的js文件js中方法的url和controller中方法的url总结 前言 之前写过一篇文章&#xff0c;若依微服务版本搭建&#xff0c;超详细&#xff0c;就介绍了怎么搭建若依微服务版本&#xff0c;我们使用若依就…

【大厂AI课学习笔记】【2.1 人工智能项目开发规划与目标】(2)项目开发周期

我们来学习项目开发的周期。 再次声明&#xff0c;本文来自腾讯AI课的学习笔记&#xff0c;图片和文字&#xff0c;仅用于大家学习&#xff0c;想了解更多知识&#xff0c;请访问腾讯云相关章节。如果争议&#xff0c;请联系作者。 今天&#xff0c;我们来学习AI项目的周期。 主…

基于python的企业编码管理系统源码【附下载】

《企业编码生成系统》程序使用说明 在PyCharm中运行《企业编码生成系统》即可进入如图1所示的系统主界面。在该界面中可以选择要使用功能对应的菜单进行不同的操作。在选择功能菜单时&#xff0c;只需要输入对应的数字即可。 图1 系统主界面 具体的操作步骤如下&#xff1a;…

如何选择阿里云服务器配置?阿里云服务器CPU内存带宽攻略

阿里云服务器配置怎么选择&#xff1f;根据实际使用场景选择&#xff0c;个人搭建网站可选2核2G配置&#xff0c;访问量大的话可以选择2核4G配置&#xff0c;企业部署Java、Python等开发环境可以选择2核8G配置&#xff0c;企业数据库、Web应用或APP可以选择4核8G配置或4核16G配…

QML | 属性特性(property)

一、属性特性 属性是对象的一个特性,可以分配一个静态的值,也可以绑定一个动态表达式。属性的值可以被其他对象读取。一般而言,属性的值也可以被其他对象修改,除非显式声明不允许这么做,也就是声明为只读属性。 1.定义属性特性 属性可以在C++中通过注册一个类的Q_PROPERT…

推荐几个漏洞扫描工具

渗透测试收集信息完成后&#xff0c;就要根据所收集的信息&#xff0c;扫描目标站点可能存在的漏洞了&#xff0c;包括我们之前提到过的如&#xff1a;SQL注入漏洞、跨站脚本漏洞、文件上传漏洞、文件包含漏洞及命令执行漏洞等&#xff0c;通过这些已知的漏洞&#xff0c;来寻找…

matlab代码--汉明码通过不同信道的误码率分析

1 前言 汉明码是在原数据中的一些固定位置&#xff0c;插入一个0&#xff08;或1&#xff09;&#xff0c;以进行奇&#xff08;或偶&#xff09;校验位&#xff0c;虽然使原数据变长&#xff0c;但可使其拥有纠错能力。能侦测并更正一个比特的错误&#xff1b;若有两个比特出…

京东平台的行业数据(数据分析报告)在哪里看?如何获取?

京东行业分析数据获取可通过以下途径&#xff1a; 京东官方不定期会发布行业白皮书或市场研究报告&#xff0c;商家可以关注京东官网、官方公众号、官方论坛等渠道获取最新发布的研究报告。 对于有技术开发能力的企业&#xff0c;可以通过申请接入京东开放平台API&#xff…

电脑竖屏显示了怎么回复原状

电脑屏幕变成这样 怎么恢复原状&#xff1f; 1、登录系统 2、在桌面上空白点击鼠标右键 3、在右键菜单中选择“屏幕分辨率”&#xff0c;左键点击打开 4、在窗口中“方向”位置选择“横向” 5、保存设置win7桌面即可恢复到正常状态

Arduino的PWM功能应用:会呼吸的灯

目录 概述 1 认识PWM 1.1 PWM原理 1.2 PWM的应用 1.3 在Arduino中使用PWM 2.硬件 2.1 硬件结构 2.2 线路连接 3 软件 3.1 编译和下载代码 3.2 详细代码 4 测试 4.1 灯的变化测试 4.2 使用逻辑分析仪看波形 概述 本文通过一个简单的案例&#xff0c;介绍Arduino中P…

Nginx 正向代理、反向代理

文章目录 前言1. 正向代理1.1 概念1.2 逻辑图1.3 使用场景 2. 反向代理2.1 概念2.2 逻辑图2.3 使用场景 前言 正向代理主要是用来解决访问限制问题&#xff1b;反向代理则是提供负载均衡、安全防护等作用 1. 正向代理 1.1 概念 正向代理是一个位于客户端和目标服务器之间的代理…

echarts图表中的基本设置参数

取消显示坐标值 axisLabel: { show: false} 取消坐标轴刻度线 axisTick: { show: false} 取消网格线 splitLine: { show: false } 去除y轴的线 //写在yAxis里面 axisLine:{show:false},axisTick:{show:false},去除y轴轴线&#xff08;背景线&#xff09; splitLine…