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