ZHCUC77 August 2024
图 3-3 显示了进行电压和电流采样时发生的不同事件,其中用绿色标出的项目由 MSPM0G1106 硬件模块完成。
每个相位的新电流样本在每 OSR(此设计中为 1024 个调制时钟周期)准备就绪,从而在连接到 MSPM0+ MCU 的 SPI 总线上每秒产生 4000 个样本。数据传输包含两个事务:第一个是 12 个字节的样本,两个 ADS131M02 通道各包含其中 3 个字节的数据;第二个是另外 15 个字节,包含 AMC131M03 上一个通道用于分流器的数据,还有未使用和通过软件禁用的另外两个模拟输入通道的 0x00 00 00 数据。
假设 ADS131M02 和 AMC131M03 器件最近一次就绪的相电流和电压样本对应于第 Nth - 1 个电流和电压样本,即 Iphx[N - 1] 和 Vphx[N - 1],一旦新样本准备就绪,ADS131M02 就会将 DRDY 引脚置为低电平有效。ADS131M02 DRDY 引脚的下降沿会导致 MSPM0+ MCU 上的 GPIO 端口中断,从而触发端口 ISR,让后台进程在端口 ISR 运行。AMC131M03 还会生成 DRDY 引脚中断,并在通过 SPI 读出 ADS131M02 后立即提供该中断。
图 3-4 显示了后台进程,该进程主要处理测试软件中有严格时序要求的事件。
在后台进程中,先前获得的电压样本 (Vphx[N - 2]) 和先前获得的电流样本 (Iphx[N - 2]) 会存储起来,以便稍后供 per_sample_dsp ()
函数使用,该函数负责更新用于计算计量参数的中间点积数量。
在存储先前从 ADS131M02 和 AMC131M03 获得的电压和电流样本后,通过将相应的片选信号置为低电平有效,来启用与 ADS131M02 的通信。然后,将 DMA 配置为针对 ADS131M02 器件最新电流和电压样本(Iphx[N – 1] 和
Vphx[N – 1])发送请求,并接收来自 ADS131M02 的数据包响应。最新 ADC 数据样本的请求(发送虚拟数据 0x00)和接收由 DMA 模块自动完成。
图 3-5 显示了由 MSPM0+ MCU 的 DMA 发送的数据包,以及同样由 DMA 接收的来自 ADS131M02 或 AMC131M03 的响应数据包。发送和接收数据包中包含四个或五个字,其中每个字的长度为三个字节,从而在 SPI 总线上产生 12 或 15 字节的 DMA 事务。请注意,ADS131M02 数据包的长度为 12 个字节,因为仅通过 DMA 事务读出两个通道,每个通道各有三个字节,而 AMC131M03 需要 15 个字节。固件会自动处理 ADC 器件选择并循环读取数据,因为固件会更新每个 ADC 的 DMA 参数(包括数据包数据长度),并激活与每个 ADC 的正确 CS 线路。
从 ADS131M02 器件请求 ADC 数据时,必须由 MSPM0+ MCU 发送的第一个字是命令字。测试软件不需要在典型的 ADC 样本读出期间更改 ADS131M02 的设置或读取任何寄存器,因此会向 ADS131M02 发送 NULL 命令,这使设计人员能够无需更改器件状态即可从 ADS131M02 获取 ADC 样本。
null 命令的实际大小是 16 位;但是,由于使用的是 24 位字,16 位命令必须在命令末尾填充一个额外的值 0x00。因此发送的 NULL 命令字的值为 0x00 00 00。当 MSPM0+ MCU 移出命令字时,MCU 同时将响应字移入前一个数据包的命令字。NULL 命令的响应字是 STATUS 寄存器的内容。此设计中不使用 STATUS 寄存器的内容,因此从 ADS131M02 接收到的第一个字将被忽略(未在软件代码中处理)。
写入命令字后,必须对每个要读取的字节执行一次虚拟写入。若要启用 SPI 时钟,便需要写入虚拟字节,这是从 ADS131M02 器件读取一个字节所必需的。每次写入虚拟字节时,都会将值 0x00 写入 SPI 发送寄存器。通过在写入命令字节后立即写入三个虚拟字节,MSPM0+ MCU 可以从 ADS131M02 的通道 0 接收 3 字节的 ADC 值。写入接下来的 3 个虚拟字节将获取通道 1 的 ADC 数据,写入接下来的 3 个虚拟字节将获取 CRC 字。CRC 字为 24 位;但是,请注意实际的 CRC 只有 16 位,这些位对应于 24 位字的最高有效位。因此,在解析 CRC 字时,不需要最后一个字节(但请注意,为了使 ADS131M02 正确运行,仍必须发送虚拟写入的这个零填充字节)。
每当 DMA 接收到整个 Iphx[N - 1] 数据包时,便会自动调用 DMA ISR。在 ISR 内,CRC 基于三个命令和 ADC 通道数据字计算(共计 3 x 3 = 9 字节)。此 CRC 计算可在两种模式下完成:使用 MSPM0G110 MCU 的 CRC 模块或使用 memcpy()
函数,将 9 字节 ADC 数据移动到自动计算 CRC16 的特殊存储器区域。
紧随从 AMC131M03 读取 SPI 数据后,但使用 NULL 命令和三个 24 位数据通道以及带有填充的 0x00 字节的 CRC16。这完成了对 AMC131M03 器件的当前样本 Iphx[N – 1] 的读取,然后还会检查 CRC16 校验和。
有关 CRC16 检查实现的详细信息,请参阅 ADS_verifyADSCRC()
和 AMC_verifyAMCCRC()
例程。memcpy()
实现的计算速度比使用带字节馈送的 CRC16 寄存器快近 5 倍,并且在默认情况下使用。可以向 CRC 模块馈送 8 位或 16 位数据,并且由于共有 9 个字节,因此 CRC 模块正在逐字节更新。计算出数据包的 CRC 后,会将校验结果与从 ADS131M02 发送的数据包中获得的 CRC 进行比较。发送的 CRC 从字节 10 和 11 进行解析(最后一个字节 12 是 CRC16 的零填充,因此会忽略该值)。
如果计算出的 CRC 和解析的 CRC 相等,则 CRC 校验正确,并解析 ADC 数据以获取时间 N - 1 处的电压和电流样本值。有两个变量用于计算每个 ADC 的合格和不合格 CRC16 数据包,名为 crcPassCount
和 crcFailCount
。解析的电压和电流样本被置于临时缓冲器中,以便在下一次中断调用 per_sample_dsp()
函数时使用此信息。当 DMA 上的 SPI 传输结束时,CS(芯片选择)线路再次从 MSPM0+ MCU 自动上拉回高电平,以便在下次电流样本读出准备就绪之前正确复位 AMC131M03 通信。
在使用 DMA 通道将最新电流和电压样本 Iphx[N - 1] 和 Vphx[N - 1] 传输到 MSPM0+ MCU 的同时,ADS131M02 已对下一个电压 (Vphx[N]) 和电流样本 (Iphx[N]) 进行采样,而测试软件对从 ADS131M02 和 AMC131M03 获取的早期电压 (Vphx[N - 2]) 和电流样本 (Iphx[N - 2]) 执行逐样本处理。可使用这种逐样本处理方法来更新用于计算计量参数的中间点积。处理样本后,后台进程使用 per_sample_energy_pulse_processing
执行电能比例脉冲的计算和输出。一旦 per_sample_energy_pulse_processing
完成,测试软件便会从端口 ISR 退出。
总之,在单个 DRDY 周期中有两个 SPI 读取数据周期,首先读取 ADS131M02 器件,然后是 AMC131M03。这两个 SPI 事务之间的唯一区别在于,ADS131M02 有两个通道,而 AMC131M03 有三个通道,因此 SPI 数据包的长度总共为 12 字节或 15 字节。