MC33771 measurement channel timing issue

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
已解决

MC33771 measurement channel timing issue

跳至解决方案
4,209 次查看
paneri
Contributor III

Hi, I am working on MC33771BSP AFE and I am able to read measurement registers properly but the time taken from sending start of conversion bit to read current measurement register is 7ms , but as per datasheet it will take only 0.86 ms to read all measurement registers. Please any one support as I need to reduce the time for reading the measurement registers.

measuremnt_channel.PNG

Thanks.
Paneri Shah.

0 项奖励
回复
1 解答
4,150 次查看
jann_
NXP Employee
NXP Employee

Hi Paneri,

I am the developer of the SW driver you shared screenshots from. A few notes and recommendations follows:

1. Time values in the BCC datasheet do not count any SW overhead. They asume time for transmission of SOC command (at the physical layer = SPI) + conversion + reading the values back. No time for pre- (and post-) processing of data at MCU is counted.

2. I suppose you are using S32K144 MCU with some code based on the examples provided with the SW driver. Therefore, the time mentioned in the datasheet is extended by packing the SPI frames, calculating/checking CRC and finally by not negligible time overhead of used S32K144 SPI SDK in your case.

3. If you would like to decreace the time for measuring the current to the possible minimum, I would recommend:

  • Calling of BCC_Meas_IsConverting() in getMeasurements() is not needed if your BCC_MCU_WaitUs() is implemented accurately. This can be removed as one more read-request causes a time overhead.
  • If you are interested only in the current measurement, read back only the MEAS_ISENSE1 and MEAS_ISENSE2 registers (instead of 30 registers by BCC_Meas_GetRawValues()). This will save really a lot of time.
  • Optimize pre-processing: Pre-create the content of sent SPI frames including CRCs - i.e. write your own optimized code and do not use the BCC SW driver to dynamically create the frames.
  • Optimize SPI transfer: For the SPI transmission, do not use the SDK SPI driver in BCC_MCU_* functions but implement a so-called "pooling" approach for the LPSPI periphery to directly access the LPSPI periphery registers. When the periphery is well configured, only (+-) three register accesses are enough to start the SPI transmission including the movement of transmitted data to LPSPI FIFO.
    The same with reading the data received from SPI MISO to LPSPI periphery.

Best regards,

Jan

在原帖中查看解决方案

0 项奖励
回复
8 回复数
4,204 次查看
TomasVaverka
NXP TechSupport
NXP TechSupport

Hi Paneri,

Are you polling the EOC_N bit or wait for the maximum conversion time (546us in 16-bit mode, with some margin typically 600us) before reading all the measured values?

Is your SPI communication running at 4Mbps? If yes, it should indeed take in total ~900us.

Best regards,

Tomas

0 项奖励
回复
4,165 次查看
paneri
Contributor III

Hello Tomas,
I have a requirement to detect over current in 500us. Is there any way to do it?

0 项奖励
回复
4,185 次查看
paneri
Contributor III

Hi Tomas, I have changed frequency to 4Mhz and ensure it using Hantek(please check image).
But still the time is not reduced after increasing frequency also. I have attached the code snippet below. Please take a look and support for reducing time of reading measurement registers.SPI frequency set to 4Mhz.SPI frequency set to 4Mhz.getMeasurement functiongetMeasurement function

paneri_0-1616494179738.png

paneri_2-1616494235706.png

 

 

 

 

0 项奖励
回复
4,146 次查看
jann_
NXP Employee
NXP Employee

If I'm counting well:

When you would be reading only the current, you should save reading of 24 registers in terms of the t(CLST_SPI) datasheet value, i.e. 24 times 40-bit SPI frame @4MHz, i.e. more than 240us from the t(CLST_SPI) datasheet value.

Therefore, with a highly optimized SW, you could be theoretically able to read the current within 500 us with the BCC configured to 15-bit ADC (not 16-bit ADC)

Best regards,

Jan

0 项奖励
回复
4,151 次查看
jann_
NXP Employee
NXP Employee

Hi Paneri,

I am the developer of the SW driver you shared screenshots from. A few notes and recommendations follows:

1. Time values in the BCC datasheet do not count any SW overhead. They asume time for transmission of SOC command (at the physical layer = SPI) + conversion + reading the values back. No time for pre- (and post-) processing of data at MCU is counted.

2. I suppose you are using S32K144 MCU with some code based on the examples provided with the SW driver. Therefore, the time mentioned in the datasheet is extended by packing the SPI frames, calculating/checking CRC and finally by not negligible time overhead of used S32K144 SPI SDK in your case.

3. If you would like to decreace the time for measuring the current to the possible minimum, I would recommend:

  • Calling of BCC_Meas_IsConverting() in getMeasurements() is not needed if your BCC_MCU_WaitUs() is implemented accurately. This can be removed as one more read-request causes a time overhead.
  • If you are interested only in the current measurement, read back only the MEAS_ISENSE1 and MEAS_ISENSE2 registers (instead of 30 registers by BCC_Meas_GetRawValues()). This will save really a lot of time.
  • Optimize pre-processing: Pre-create the content of sent SPI frames including CRCs - i.e. write your own optimized code and do not use the BCC SW driver to dynamically create the frames.
  • Optimize SPI transfer: For the SPI transmission, do not use the SDK SPI driver in BCC_MCU_* functions but implement a so-called "pooling" approach for the LPSPI periphery to directly access the LPSPI periphery registers. When the periphery is well configured, only (+-) three register accesses are enough to start the SPI transmission including the movement of transmitted data to LPSPI FIFO.
    The same with reading the data received from SPI MISO to LPSPI periphery.

Best regards,

Jan

0 项奖励
回复
4,079 次查看
paneri
Contributor III

Hi,

I am trying to optimize the BCC_S32k144_Monitoring_Diagnostics code by transmit and receive LPSPI data in polling method. I am able to write the data for the first time properly but while reading the data the RDF flag of status register is not getting set because of which I am not able to read any data and simply getting CRC error. I have attached the code snippets below. Please help to find where is the issue.

0 项奖励
回复
4,074 次查看
jann_
NXP Employee
NXP Employee

Hi paneri,

the issue of your code is that RDR and TDR are 32b FIFO registers (not 8bit!). I cannot test any code as have not the HW equipment at home, but my test implementation of BCC_MCU_TransferSpi was like:

/* Not sure about the byte order...!! */
LPSPI0->TDR = (transBuf[0] << 24U) | (transBuf[1] << 16U) | (transBuf[2] << 8U) | (transBuf[3]);
LPSPI0->TDR = (transBuf[4]);

/* Wait till transfer is done. (LPSPI0->FSR[TXCOUNT] is 0) */
/* Wait till 2 words are in RX FIFO (LPSPI0->FSR[RXCOUNT] is 2) */
/* Read that two 32b words from LPSPI0->RDR a parse individual bytes to recvBuf */

BR,
Jan

0 项奖励
回复
4,114 次查看
paneri
Contributor III

Hi jann,

Thanks for the information, I will try to optimize the code based on your suggestions.

0 项奖励
回复