This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM62A3-Q1: The transmission rate is reduced after enabled spi DMA mode

Part Number: AM62A3-Q1

Tool/software:

Hi Andreas,

Refer to this page which is enable DMA mode of main spi0.

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1461583/am62a3-q1-how-to-enable-main-spi0-dma-mode-on-am62ax

After enabled, it works and the cpuload is reduced a lot.

But, I found the transmission rate is reduced after enabled spi DMA mode.

Below are the test logs:

PIO mode

root@am62axx-evm:~# spidev_test -D /dev/spidev1.0 -s 200000 -b 8 -S 256 -I 10000000
spi mode: 0x0
bits per word: 8
max speed: 200000 Hz (200 KHz)
rate: tx 186.0kbps, rx 186.0kbps
rate: tx 215.0kbps, rx 215.0kbps
rate: tx 214.6kbps, rx 214.6kbps
rate: tx 215.0kbps, rx 215.0kbps
rate: tx 215.4kbps, rx 215.4kbps
^C
root@am62axx-evm:~# spidev_test -D /dev/spidev1.0 -s 500000 -b 8 -S 256 -I 10000000
spi mode: 0x0
bits per word: 8
max speed: 500000 Hz (500 KHz)
rate: tx 454.7kbps, rx 454.7kbps
rate: tx 519.8kbps, rx 519.8kbps
rate: tx 519.0kbps, rx 519.0kbps
rate: tx 519.4kbps, rx 519.4kbps
rate: tx 519.4kbps, rx 519.4kbps
^C
root@am62axx-evm:~# spidev_test -D /dev/spidev1.0 -s 900000 -b 8 -S 256 -I 10000000
spi mode: 0x0
bits per word: 8
max speed: 900000 Hz (900 KHz)
rate: tx 756.5kbps, rx 756.5kbps
rate: tx 869.6kbps, rx 869.6kbps
rate: tx 867.1kbps, rx 867.1kbps
rate: tx 860.2kbps, rx 860.2kbps
rate: tx 860.2kbps, rx 860.2kbps
^C
root@am62axx-evm:~# spidev_test -D /dev/spidev1.0 -s 960000 -b 8 -S 256 -I 10000000
spi mode: 0x0
bits per word: 8
max speed: 960000 Hz (960 KHz)
rate: tx 859.3kbps, rx 859.3kbps
rate: tx 921.6kbps, rx 921.6kbps
rate: tx 922.0kbps, rx 922.0kbps
rate: tx 922.4kbps, rx 922.4kbps
rate: tx 922.4kbps, rx 922.4kbps
^C

DMA mode

root@am62axx-evm:/boot/dtb/ti# spidev_test -D /dev/spidev1.0 -s 200000 -b 8 -S 256 -I 10000000
spi mode: 0x0
bits per word: 8
max speed: 200000 Hz (200 KHz)
rate: tx 1.2kbps, rx 1.2kbps
rate: tx 2.9kbps, rx 2.9kbps
rate: tx 1.2kbps, rx 1.2kbps
rate: tx 1.2kbps, rx 1.2kbps
rate: tx 1.2kbps, rx 1.2kbps
^C
root@am62axx-evm:/boot/dtb/ti# spidev_test -D /dev/spidev1.0 -s 500000 -b 8 -S 256 -I 10000000
spi mode: 0x0
bits per word: 8
max speed: 500000 Hz (500 KHz)
rate: tx 9.4kbps, rx 9.4kbps
rate: tx 2.5kbps, rx 2.5kbps
rate: tx 2.5kbps, rx 2.5kbps
rate: tx 2.5kbps, rx 2.5kbps
rate: tx 2.5kbps, rx 2.5kbps
^C
root@am62axx-evm:/boot/dtb/ti# spidev_test -D /dev/spidev1.0 -s 900000 -b 8 -S 256 -I 10000000
spi mode: 0x0
bits per word: 8
max speed: 900000 Hz (900 KHz)
rate: tx 26.2kbps, rx 26.2kbps
rate: tx 126.6kbps, rx 126.6kbps
rate: tx 4.9kbps, rx 4.9kbps
rate: tx 36.5kbps, rx 36.5kbps
rate: tx 45.5kbps, rx 45.5kbps
rate: tx 46.7kbps, rx 46.7kbps
^C
root@am62axx-evm:/boot/dtb/ti# spidev_test -D /dev/spidev1.0 -s 960000 -b 8 -S 256 -I 10000000
spi mode: 0x0
bits per word: 8
max speed: 960000 Hz (960 KHz)
rate: tx 326.9kbps, rx 326.9kbps
rate: tx 499.3kbps, rx 499.3kbps
rate: tx 501.4kbps, rx 501.4kbps
rate: tx 324.4kbps, rx 324.4kbps
rate: tx 670.1kbps, rx 670.1kbps
^C

In PIO mode, the transmission rate increases as the clock frequency increases.

In DMA mode, the transmission rate exhibits a substantial increase as the clock rate approaches 1 MHz. And it's not stable.

Could you please help to check this phenomenon?

Thanks.

Tao

  • Hi Tao,

    that's an interesting observation. I won't be able to investigate this more deeply probably for another 2 weeks due to other priorities I need to handle first, but there's one thing I noticed. Usually the SPI would be operated at much higher speeds, like 5MHz, 10MHz, or more. Can you increase your SPI clock speed much higher, and see if this gives you more consistency in terms of DMA use?

    Regards, Andreas

  • Hi Andreas,

    Test results of much higher speeds.

    PIO mode

    root@am62axx-evm:~# spidev_test -D /dev/spidev1.0 -s 5000000 -b 8 -S 256 -I 10000000
    spi mode: 0x0
    bits per word: 8
    max speed: 5000000 Hz (5000 KHz)
    rate: tx 2755.4kbps, rx 2755.4kbps
    rate: tx 3142.9kbps, rx 3142.9kbps
    rate: tx 3149.8kbps, rx 3149.8kbps
    rate: tx 3149.8kbps, rx 3149.8kbps
    rate: tx 3149.0kbps, rx 3149.0kbps
    rate: tx 3147.8kbps, rx 3147.8kbps
    ^C
    root@am62axx-evm:~# spidev_test -D /dev/spidev1.0 -s 10000000 -b 8 -S 256 -I 10000000
    spi mode: 0x0
    bits per word: 8
    max speed: 10000000 Hz (10000 KHz)
    rate: tx 4064.1kbps, rx 4064.1kbps
    rate: tx 4063.6kbps, rx 4063.6kbps
    rate: tx 4060.8kbps, rx 4060.8kbps
    rate: tx 4062.8kbps, rx 4062.8kbps
    rate: tx 4062.4kbps, rx 4062.4kbps
    ^C
    root@am62axx-evm:~# spidev_test -D /dev/spidev1.0 -s 20000000 -b 8 -S 256 -I 10000000
    spi mode: 0x0
    bits per word: 8
    max speed: 20000000 Hz (20000 KHz)
    rate: tx 4276.6kbps, rx 4276.6kbps
    rate: tx 4655.1kbps, rx 4655.1kbps
    rate: tx 4704.7kbps, rx 4704.7kbps
    rate: tx 4704.7kbps, rx 4704.7kbps
    rate: tx 4635.0kbps, rx 4635.0kbps

    DMA mode

    root@am62axx-evm:~# spidev_test -D /dev/spidev1.0 -s 5000000 -b 8 -S 256 -I 10000000
    spi mode: 0x0
    bits per word: 8
    max speed: 5000000 Hz (5000 KHz)
    rate: tx 3967.0kbps, rx 3967.0kbps
    rate: tx 4652.2kbps, rx 4652.2kbps
    rate: tx 4649.4kbps, rx 4649.4kbps
    rate: tx 4613.3kbps, rx 4613.3kbps
    rate: tx 4649.0kbps, rx 4649.0kbps
    
    ^C
    root@am62axx-evm:~# spidev_test -D /dev/spidev1.0 -s 10000000 -b 8 -S 256 -I 10000000
    spi mode: 0x0
    bits per word: 8
    max speed: 10000000 Hz (10000 KHz)
    rate: tx 6665.4kbps, rx 6665.4kbps
    rate: tx 7959.3kbps, rx 7959.3kbps
    rate: tx 7963.9kbps, rx 7963.9kbps
    rate: tx 7902.4kbps, rx 7902.4kbps
    rate: tx 7978.6kbps, rx 7978.6kbps
    rate: tx 7979.4kbps, rx 7979.4kbps
    ^C
    root@am62axx-evm:~# spidev_test -D /dev/spidev1.0 -s 20000000 -b 8 -S 256 -I 10000000
    spi mode: 0x0
    bits per word: 8
    max speed: 20000000 Hz (20000 KHz)
    rate: tx 10409.6kbps, rx 10409.6kbps
    rate: tx 11072.3kbps, rx 11072.3kbps
    rate: tx 11090.7kbps, rx 11090.7kbps
    rate: tx 10986.7kbps, rx 10986.7kbps
    rate: tx 11068.2kbps, rx 11068.2kbps

    It seems that at high clock frequencies, DMA mode is advantageous.

    Thanks

    Tao

  • Tao,

    thanks for the additional testing.

    Was there any reason you were trying to run the SPI master at such a relatively low frequency initially? What SPI slave device are you talking to externally?

    Also, if you want to make sure, it might be helpful to confirm the actual SPI waveforms using a logic analyzer; and not only rely on the SW-generated output from the spidev_test.c tool.

    Regards, Andreas

  • Hi Andreas,

    Was there any reason you were trying to run the SPI master at such a relatively low frequency initially? What SPI slave device are you talking to externally?

    => The slave device is a external PWC(power controller) which have no ability to handle high transfer rates. We have assessed that 200kbps is stable, and any higher is not guaranteed.

    According to your suggestion, we will do the actual measurement in communication with PWC, and will continue to update the progress here.

    Thanks.

    Tao

  • => The slave device is a external PWC(power controller) which have no ability to handle high transfer rates. We have assessed that 200kbps is stable, and any higher is not guaranteed.

    Also if you only do like 200kbps, in non-DMA mode (your original E2E post), I'm surprised it would be loading the CPU 100%?? The SPI master transfer should be interrupt-driven by default, and not cause 100% CPU loading. Can you re-create the 100% CPU loading scenario with spidev_test.c? If the high CPU load can be re-created easily I can try to find some time next week to dig a bit deeper to see what's behind this.

    Regards, Andreas