periph/spi: add support for printing and testing SPI clock rate#16727
periph/spi: add support for printing and testing SPI clock rate#16727hugueslarrive wants to merge 12 commits intoRIOT-OS:masterfrom
Conversation
|
My only issue is that if this information is needed, we should have an API for that - not poke CPU configuration in application / test code. |
This comment has been minimized.
This comment has been minimized.
19769: cpu/nrf53: add initial support with nRF5340DK-APP board r=maribu a=dylad ### Contribution description This PR adds support for nRF5340 MCU and its associated Nordic development board, nRF5340DK. This MCU provides a dual Cortex-M33, one application core running at up to 128MHz, and one network core running at up to 64MHz. Peripherals are inherited from others Nordic MCUs families so it shouldn't be hard to add more of them in followup PRs. For now, only the minimal set of peripherals is supported: - GPIO / GPIO_IRQ - UART - TIMER ### Testing procedure Build the usual test application for the supported peripherals and flash the board. nRF5340DK provides two serial ports on its embedded debugger. RIOT's shell should be available on the first one (/dev/ttyACM0) ### Issues/PRs references #18576 #19267 19782: cpu/msp430: fix for ti's msp430-gcc-opensource package ld version r=maribu a=hugueslarrive ### Contribution description My msp430 toolchain (https://www.ti.com/tool/MSP430-GCC-OPENSOURCE) was broken by #19484: ``` hugues@p700:~/github/cpu_msp430_common/RIOT$ BOARD=msb-430 make -j64 -C examples/hello-world make : on entre dans le répertoire « /home/hugues/github/cpu_msp430_common/RIOT/examples/hello-world » Building application "hello-world" for "msb-430" with MCU "msp430fxyz". "make" -C /home/hugues/github/cpu_msp430_common/RIOT/boards/common/init "make" -C /home/hugues/github/cpu_msp430_common/RIOT/boards/msb-430 "make" -C /home/hugues/github/cpu_msp430_common/RIOT/core "make" -C /home/hugues/github/cpu_msp430_common/RIOT/core/lib "make" -C /home/hugues/github/cpu_msp430_common/RIOT/cpu/msp430fxyz "make" -C /home/hugues/github/cpu_msp430_common/RIOT/drivers "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys "make" -C /home/hugues/github/cpu_msp430_common/RIOT/boards/common/msb-430 "make" -C /home/hugues/github/cpu_msp430_common/RIOT/drivers/periph_common "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/auto_init "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/div "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/libc "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/malloc_thread_safe "make" -C /home/hugues/github/cpu_msp430_common/RIOT/cpu/msp430_common "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/newlib_syscalls_default "make" -C /home/hugues/github/cpu_msp430_common/RIOT/cpu/msp430fxyz/periph "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/preprocessor "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/stdio_uart "make" -C /home/hugues/github/cpu_msp430_common/RIOT/cpu/msp430_common/periph /opt/ti/msp430-gcc/bin/../lib/gcc/msp430-elf/9.3.1/../../../../msp430-elf/bin/ld: .rodata not found for insert collect2: error: ld returned 1 exit status make: *** [/home/hugues/github/cpu_msp430_common/RIOT/examples/hello-world/../../Makefile.include:761 : /home/hugues/github/cpu_msp430_common/RIOT/examples/hello-world/bin/msb-430/hello-world.elf] Erreur 1 make : on quitte le répertoire « /home/hugues/github/cpu_msp430_common/RIOT/examples/hello-world » hugues@p700:~/github/cpu_msp430_common/RIOT$ /opt/ti/msp430-gcc/msp430-elf/bin/ld --version GNU ld (Mitto Systems Limited - msp430-gcc 9.3.1.11) 2.34 Copyright (C) 2020 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License version 3 or (at your option) a later version. This program has absolutely no warranty. hugues@p700:~/github/cpu_msp430_common/RIOT$ /opt/ti/msp430-gcc/msp430-elf/bin/ld --version | grep -Eo '[0-9]\.[0-9]+' 9.3 1.11 2.34 hugues@p700:~/github/cpu_msp430_common/RIOT$ /opt/ti/msp430-gcc/msp430-elf/bin/ld --version | grep -Eo '[0-9]\.[0-9]+$' 2.34 ``` ### Testing procedure ``` hugues@p700:~/github/cpu_msp430_common/RIOT$ BOARD=msb-430 make -j64 -C examples/hello-world make : on entre dans le répertoire « /home/hugues/github/cpu_msp430_common/RIOT/examples/hello-world » Building application "hello-world" for "msb-430" with MCU "msp430fxyz". "make" -C /home/hugues/github/cpu_msp430_common/RIOT/boards/common/init "make" -C /home/hugues/github/cpu_msp430_common/RIOT/boards/msb-430 "make" -C /home/hugues/github/cpu_msp430_common/RIOT/core "make" -C /home/hugues/github/cpu_msp430_common/RIOT/core/lib "make" -C /home/hugues/github/cpu_msp430_common/RIOT/cpu/msp430fxyz "make" -C /home/hugues/github/cpu_msp430_common/RIOT/drivers "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys "make" -C /home/hugues/github/cpu_msp430_common/RIOT/boards/common/msb-430 "make" -C /home/hugues/github/cpu_msp430_common/RIOT/drivers/periph_common "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/auto_init "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/div "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/libc "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/malloc_thread_safe "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/newlib_syscalls_default "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/preprocessor "make" -C /home/hugues/github/cpu_msp430_common/RIOT/cpu/msp430_common "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/stdio_uart "make" -C /home/hugues/github/cpu_msp430_common/RIOT/cpu/msp430fxyz/periph "make" -C /home/hugues/github/cpu_msp430_common/RIOT/cpu/msp430_common/periph text data bss dec hex filename 8612 722 866 10200 27d8 /home/hugues/github/cpu_msp430_common/RIOT/examples/hello-world/bin/msb-430/hello-world.elf make : on quitte le répertoire « /home/hugues/github/cpu_msp430_common/RIOT/examples/hello-world » ``` ### Issues/PRs references Introduced by #19484, highlighted in #16727. Co-authored-by: Dylan Laduranty <dylan.laduranty@mesotic.com> Co-authored-by: Hugues Larrive <hlarrive@pm.me>
19782: cpu/msp430: fix for ti's msp430-gcc-opensource package ld version r=maribu a=hugueslarrive ### Contribution description My msp430 toolchain (https://www.ti.com/tool/MSP430-GCC-OPENSOURCE) was broken by #19484: ``` hugues@p700:~/github/cpu_msp430_common/RIOT$ BOARD=msb-430 make -j64 -C examples/hello-world make : on entre dans le répertoire « /home/hugues/github/cpu_msp430_common/RIOT/examples/hello-world » Building application "hello-world" for "msb-430" with MCU "msp430fxyz". "make" -C /home/hugues/github/cpu_msp430_common/RIOT/boards/common/init "make" -C /home/hugues/github/cpu_msp430_common/RIOT/boards/msb-430 "make" -C /home/hugues/github/cpu_msp430_common/RIOT/core "make" -C /home/hugues/github/cpu_msp430_common/RIOT/core/lib "make" -C /home/hugues/github/cpu_msp430_common/RIOT/cpu/msp430fxyz "make" -C /home/hugues/github/cpu_msp430_common/RIOT/drivers "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys "make" -C /home/hugues/github/cpu_msp430_common/RIOT/boards/common/msb-430 "make" -C /home/hugues/github/cpu_msp430_common/RIOT/drivers/periph_common "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/auto_init "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/div "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/libc "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/malloc_thread_safe "make" -C /home/hugues/github/cpu_msp430_common/RIOT/cpu/msp430_common "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/newlib_syscalls_default "make" -C /home/hugues/github/cpu_msp430_common/RIOT/cpu/msp430fxyz/periph "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/preprocessor "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/stdio_uart "make" -C /home/hugues/github/cpu_msp430_common/RIOT/cpu/msp430_common/periph /opt/ti/msp430-gcc/bin/../lib/gcc/msp430-elf/9.3.1/../../../../msp430-elf/bin/ld: .rodata not found for insert collect2: error: ld returned 1 exit status make: *** [/home/hugues/github/cpu_msp430_common/RIOT/examples/hello-world/../../Makefile.include:761 : /home/hugues/github/cpu_msp430_common/RIOT/examples/hello-world/bin/msb-430/hello-world.elf] Erreur 1 make : on quitte le répertoire « /home/hugues/github/cpu_msp430_common/RIOT/examples/hello-world » hugues@p700:~/github/cpu_msp430_common/RIOT$ /opt/ti/msp430-gcc/msp430-elf/bin/ld --version GNU ld (Mitto Systems Limited - msp430-gcc 9.3.1.11) 2.34 Copyright (C) 2020 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License version 3 or (at your option) a later version. This program has absolutely no warranty. hugues@p700:~/github/cpu_msp430_common/RIOT$ /opt/ti/msp430-gcc/msp430-elf/bin/ld --version | grep -Eo '[0-9]\.[0-9]+' 9.3 1.11 2.34 hugues@p700:~/github/cpu_msp430_common/RIOT$ /opt/ti/msp430-gcc/msp430-elf/bin/ld --version | grep -Eo '[0-9]\.[0-9]+$' 2.34 ``` ### Testing procedure ``` hugues@p700:~/github/cpu_msp430_common/RIOT$ BOARD=msb-430 make -j64 -C examples/hello-world make : on entre dans le répertoire « /home/hugues/github/cpu_msp430_common/RIOT/examples/hello-world » Building application "hello-world" for "msb-430" with MCU "msp430fxyz". "make" -C /home/hugues/github/cpu_msp430_common/RIOT/boards/common/init "make" -C /home/hugues/github/cpu_msp430_common/RIOT/boards/msb-430 "make" -C /home/hugues/github/cpu_msp430_common/RIOT/core "make" -C /home/hugues/github/cpu_msp430_common/RIOT/core/lib "make" -C /home/hugues/github/cpu_msp430_common/RIOT/cpu/msp430fxyz "make" -C /home/hugues/github/cpu_msp430_common/RIOT/drivers "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys "make" -C /home/hugues/github/cpu_msp430_common/RIOT/boards/common/msb-430 "make" -C /home/hugues/github/cpu_msp430_common/RIOT/drivers/periph_common "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/auto_init "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/div "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/libc "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/malloc_thread_safe "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/newlib_syscalls_default "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/preprocessor "make" -C /home/hugues/github/cpu_msp430_common/RIOT/cpu/msp430_common "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/stdio_uart "make" -C /home/hugues/github/cpu_msp430_common/RIOT/cpu/msp430fxyz/periph "make" -C /home/hugues/github/cpu_msp430_common/RIOT/cpu/msp430_common/periph text data bss dec hex filename 8612 722 866 10200 27d8 /home/hugues/github/cpu_msp430_common/RIOT/examples/hello-world/bin/msb-430/hello-world.elf make : on quitte le répertoire « /home/hugues/github/cpu_msp430_common/RIOT/examples/hello-world » ``` ### Issues/PRs references Introduced by #19484, highlighted in #16727. Co-authored-by: Hugues Larrive <hlarrive@pm.me>
19733: cpu/msp430: reorganize code r=maribu a=maribu ### Contribution description RIOT supports two distinct families of the MSP430: The [MSP430 x1xx] MCU family and the [MSP430 F2xx/G2xx] MCU family. For both incompatible MCU families the code was located in the msp430fxyz folder, resulting in case of the UART driver in particularly bizarre code looking roughly like this: ```C #ifndef UART_USE_USCI /* implementation of x1xx peripheral ... */ #else /* implementation of F2xx/G2xx peripheral ... */ #endif /* zero shared code between both variants */ ``` This moves peripheral drivers shared between the two families to msp430_common and splits the SPI and UART driver into two MCU families. In addition, it cleans up the `msp430_regs.h` by dropping most of it and using the macros and symbols provided by the vendor header files. There is little reason for us to maintain constants when TI is already doing that. [MSP430 x1xx]: https://www.ti.com/lit/ug/slau049f/slau049f.pdf [MSP430 F2xx/G2xx]: https://www.ti.com/lit/ug/slau144k/slau144k.pdf 19747: gnrc/ipv6/nib: reset rs_sent counter also for not-6LN interfaces r=maribu a=fabian18 19769: cpu/nrf53: add initial support with nRF5340DK-APP board r=maribu a=dylad ### Contribution description This PR adds support for nRF5340 MCU and its associated Nordic development board, nRF5340DK. This MCU provides a dual Cortex-M33, one application core running at up to 128MHz, and one network core running at up to 64MHz. Peripherals are inherited from others Nordic MCUs families so it shouldn't be hard to add more of them in followup PRs. For now, only the minimal set of peripherals is supported: - GPIO / GPIO_IRQ - UART - TIMER ### Testing procedure Build the usual test application for the supported peripherals and flash the board. nRF5340DK provides two serial ports on its embedded debugger. RIOT's shell should be available on the first one (/dev/ttyACM0) ### Issues/PRs references #18576 #19267 19782: cpu/msp430: fix for ti's msp430-gcc-opensource package ld version r=maribu a=hugueslarrive ### Contribution description My msp430 toolchain (https://www.ti.com/tool/MSP430-GCC-OPENSOURCE) was broken by #19484: ``` hugues@p700:~/github/cpu_msp430_common/RIOT$ BOARD=msb-430 make -j64 -C examples/hello-world make : on entre dans le répertoire « /home/hugues/github/cpu_msp430_common/RIOT/examples/hello-world » Building application "hello-world" for "msb-430" with MCU "msp430fxyz". "make" -C /home/hugues/github/cpu_msp430_common/RIOT/boards/common/init "make" -C /home/hugues/github/cpu_msp430_common/RIOT/boards/msb-430 "make" -C /home/hugues/github/cpu_msp430_common/RIOT/core "make" -C /home/hugues/github/cpu_msp430_common/RIOT/core/lib "make" -C /home/hugues/github/cpu_msp430_common/RIOT/cpu/msp430fxyz "make" -C /home/hugues/github/cpu_msp430_common/RIOT/drivers "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys "make" -C /home/hugues/github/cpu_msp430_common/RIOT/boards/common/msb-430 "make" -C /home/hugues/github/cpu_msp430_common/RIOT/drivers/periph_common "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/auto_init "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/div "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/libc "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/malloc_thread_safe "make" -C /home/hugues/github/cpu_msp430_common/RIOT/cpu/msp430_common "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/newlib_syscalls_default "make" -C /home/hugues/github/cpu_msp430_common/RIOT/cpu/msp430fxyz/periph "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/preprocessor "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/stdio_uart "make" -C /home/hugues/github/cpu_msp430_common/RIOT/cpu/msp430_common/periph /opt/ti/msp430-gcc/bin/../lib/gcc/msp430-elf/9.3.1/../../../../msp430-elf/bin/ld: .rodata not found for insert collect2: error: ld returned 1 exit status make: *** [/home/hugues/github/cpu_msp430_common/RIOT/examples/hello-world/../../Makefile.include:761 : /home/hugues/github/cpu_msp430_common/RIOT/examples/hello-world/bin/msb-430/hello-world.elf] Erreur 1 make : on quitte le répertoire « /home/hugues/github/cpu_msp430_common/RIOT/examples/hello-world » hugues@p700:~/github/cpu_msp430_common/RIOT$ /opt/ti/msp430-gcc/msp430-elf/bin/ld --version GNU ld (Mitto Systems Limited - msp430-gcc 9.3.1.11) 2.34 Copyright (C) 2020 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License version 3 or (at your option) a later version. This program has absolutely no warranty. hugues@p700:~/github/cpu_msp430_common/RIOT$ /opt/ti/msp430-gcc/msp430-elf/bin/ld --version | grep -Eo '[0-9]\.[0-9]+' 9.3 1.11 2.34 hugues@p700:~/github/cpu_msp430_common/RIOT$ /opt/ti/msp430-gcc/msp430-elf/bin/ld --version | grep -Eo '[0-9]\.[0-9]+$' 2.34 ``` ### Testing procedure ``` hugues@p700:~/github/cpu_msp430_common/RIOT$ BOARD=msb-430 make -j64 -C examples/hello-world make : on entre dans le répertoire « /home/hugues/github/cpu_msp430_common/RIOT/examples/hello-world » Building application "hello-world" for "msb-430" with MCU "msp430fxyz". "make" -C /home/hugues/github/cpu_msp430_common/RIOT/boards/common/init "make" -C /home/hugues/github/cpu_msp430_common/RIOT/boards/msb-430 "make" -C /home/hugues/github/cpu_msp430_common/RIOT/core "make" -C /home/hugues/github/cpu_msp430_common/RIOT/core/lib "make" -C /home/hugues/github/cpu_msp430_common/RIOT/cpu/msp430fxyz "make" -C /home/hugues/github/cpu_msp430_common/RIOT/drivers "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys "make" -C /home/hugues/github/cpu_msp430_common/RIOT/boards/common/msb-430 "make" -C /home/hugues/github/cpu_msp430_common/RIOT/drivers/periph_common "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/auto_init "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/div "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/libc "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/malloc_thread_safe "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/newlib_syscalls_default "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/preprocessor "make" -C /home/hugues/github/cpu_msp430_common/RIOT/cpu/msp430_common "make" -C /home/hugues/github/cpu_msp430_common/RIOT/sys/stdio_uart "make" -C /home/hugues/github/cpu_msp430_common/RIOT/cpu/msp430fxyz/periph "make" -C /home/hugues/github/cpu_msp430_common/RIOT/cpu/msp430_common/periph text data bss dec hex filename 8612 722 866 10200 27d8 /home/hugues/github/cpu_msp430_common/RIOT/examples/hello-world/bin/msb-430/hello-world.elf make : on quitte le répertoire « /home/hugues/github/cpu_msp430_common/RIOT/examples/hello-world » ``` ### Issues/PRs references Introduced by #19484, highlighted in #16727. Co-authored-by: Marian Buschsieweke <marian.buschsieweke@posteo.net> Co-authored-by: Fabian Hüßler <fabian.huessler@ml-pa.com> Co-authored-by: Dylan Laduranty <dylan.laduranty@mesotic.com> Co-authored-by: Hugues Larrive <hlarrive@pm.me>
19752: cpu/atmega_common: checking features instead of CPU models r=benpicco a=hugueslarrive ### Contribution description Splitted from: - #19740 ### Testing procedure Tested on atmega8 with: - #19755 This one probably need to be tested on others cpu. ### Tests on 1284p: #### tests/periph/adc ``` tests/periph/adc$ BOARD=atmega1284p make -j64 clean all | grep '^ ' && BOARD=atmega1284p AVRDUDE_PROGRAMMER='usbasp -F' make flash 2>&1 | grep -- 'of flash' && BOARD=atmega1284p PORT=/dev/ttyACM0 make term text data bss dec hex filename 10712 304 1021 12037 2f05 /home/hugues/github/cpu_atmega_common/RIOT/tests/periph/adc/bin/atmega1284p/tests_adc.elf avrdude: 11016 bytes of flash written avrdude: 11016 bytes of flash verified /home/hugues/github/cpu_atmega_common/RIOT/dist/tools/pyterm/pyterm -p "/dev/ttyACM0" -b "9600" Twisted not available, please install it if you want to use pyterm's JSON capabilities 2023-06-22 18:44:54,846 # Connect to serial port /dev/ttyACM0 Welcome to pyterm! Type '/exit' to exit. 2023-06-22 18:44:55,848 # 2023-06-22 18:44:55,848 # main(): This is RIOT! (Version: 2020.07-devel-15351-gc5f75c-cpu/atmega_common) 2023-06-22 18:44:55,848 # 2023-06-22 18:44:55,849 # RIOT ADC peripheral driver test 2023-06-22 18:44:55,849 # 2023-06-22 18:44:55,850 # This test will sample all available ADC lines once every 100ms with 2023-06-22 18:44:55,850 # a 10-bit resolution and print the sampled results to STDIO 2023-06-22 18:44:55,850 # 2023-06-22 18:44:55,850 # 2023-06-22 18:44:55,851 # Successfully initialized ADC_LINE(0) 2023-06-22 18:44:55,851 # Successfully initialized ADC_LINE(1) 2023-06-22 18:44:55,851 # Successfully initialized ADC_LINE(2) 2023-06-22 18:44:55,852 # Successfully initialized ADC_LINE(3) 2023-06-22 18:44:55,852 # Successfully initialized ADC_LINE(4) 2023-06-22 18:44:55,852 # Successfully initialized ADC_LINE(5) 2023-06-22 18:44:55,853 # Successfully initialized ADC_LINE(6) 2023-06-22 18:44:55,853 # Successfully initialized ADC_LINE(7) 2023-06-22 18:44:55,853 # ADC_LINE(0): 796 2023-06-22 18:44:55,854 # ADC_LINE(1): 599 2023-06-22 18:44:55,854 # ADC_LINE(2): 522 2023-06-22 18:44:55,854 # ADC_LINE(3): 485 2023-06-22 18:44:55,854 # ADC_LINE(4): 466 2023-06-22 18:44:55,854 # ADC_LINE(5): 466 2023-06-22 18:44:55,854 # ADC_LINE(6): 478 2023-06-22 18:44:55,855 # ADC_LINE(7): 501 2023-06-22 18:44:55,855 # Exiting Pyterm make: *** [/home/hugues/github/cpu_atmega_common/RIOT/tests/periph/adc/../../../Makefile.include:879: term] Interrompre ``` #### tests/periph/gpio ``` tests/periph/gpio$ BOARD=atmega1284p make -j64 clean all | grep '^ ' && BOARD=atmega1284p AVRDUDE_PROGRAMMER='usbasp -F' make flash 2>&1 | grep -- 'of flash' && BOARD=atmega1284p PORT=/dev/ttyACM0 make term text data bss dec hex filename 17828 2112 1095 21035 522b /home/hugues/github/cpu_atmega_common/RIOT/tests/periph/gpio/bin/atmega1284p/tests_gpio.elf avrdude: 19940 bytes of flash written avrdude: 19940 bytes of flash verified /home/hugues/github/cpu_atmega_common/RIOT/dist/tools/pyterm/pyterm -p "/dev/ttyACM0" -b "9600" Twisted not available, please install it if you want to use pyterm's JSON capabilities 2023-06-22 18:46:50,726 # Connect to serial port /dev/ttyACM0 Welcome to pyterm! Type '/exit' to exit. 2023-06-22 18:46:51,734 # This is RIOT! (Version: 2020.07-devel-15351-gc5f75c-cpu/atmega_common) 2023-06-22 18:46:51,734 # GPIO peripheral driver test 2023-06-22 18:46:51,734 # 2023-06-22 18:46:51,735 # In this test, pins are specified by integer port and pin numbers. 2023-06-22 18:46:51,735 # So if your platform has a pin PA01, it will be port=0 and pin=1, 2023-06-22 18:46:51,736 # PC14 would be port=2 and pin=14 etc. 2023-06-22 18:46:51,736 # 2023-06-22 18:46:51,736 # NOTE: make sure the values you use exist on your platform! The 2023-06-22 18:46:51,738 # behavior for not existing ports/pins is not defined! init_out 1 5 2023-06-22 18:47:50,380 # init_out 1 5 toggle 1 5 2023-06-22 18:48:09,425 # toggle 1 5 > toggle 1 5 2023-06-22 18:48:12,477 # toggle 1 5 > 2023-06-22 18:48:15,013 # Exiting Pyterm ``` #### tests/periph/i2c ``` tests/periph/i2c$ BOARD=atmega1284p make -j64 clean all | grep '^ ' && BOARD=atmega1284p AVRDUDE_PROGRAMMER='usbasp -F' make flash 2>&1 | grep -- 'of flash' && BOARD=atmega1284p PORT=/dev/ttyACM0 make term text data bss dec hex filename 18634 1288 1215 21137 5291 /home/hugues/github/cpu_atmega_common/RIOT/tests/periph/i2c/bin/atmega1284p/tests_i2c.elf avrdude: 19922 bytes of flash written avrdude: 19922 bytes of flash verified /home/hugues/github/cpu_atmega_common/RIOT/dist/tools/pyterm/pyterm -p "/dev/ttyACM0" -b "9600" Twisted not available, please install it if you want to use pyterm's JSON capabilities 2023-06-22 18:50:37,434 # Connect to serial port /dev/ttyACM0 Welcome to pyterm! Type '/exit' to exit. 2023-06-22 18:50:38,437 # 2023-06-22 18:50:38,438 # main(): This is RIOT! (Version: 2020.07-devel-15351-gc5f75c-cpu/atmega_common) 2023-06-22 18:50:38,438 # Start: Test for the low-level I2C driver > i2c_scan 0 2023-06-22 18:51:37,661 # i2c_scan 0 2023-06-22 18:51:37,687 # Scanning I2C device 0... 2023-06-22 18:51:37,765 # addr not ack'ed = "-", addr ack'ed = "X", addr reserved = "R", error = "E" 2023-06-22 18:51:37,804 # 0 1 2 3 4 5 6 7 8 9 a b c d e f 2023-06-22 18:51:37,842 # 0x00 R R R R R R R R R R R R R R - - 2023-06-22 18:51:37,881 # 0x10 - - - - - - - - - - - - - - - - 2023-06-22 18:51:37,919 # 0x20 - - - - - - - - - - - - - - - - 2023-06-22 18:51:37,958 # 0x30 - - - - - - - - - - - - - - - - 2023-06-22 18:51:37,996 # 0x40 - - - - - - - - - - - - - - - - 2023-06-22 18:51:38,035 # 0x50 - - - - - - - - - - - - - - - - 2023-06-22 18:51:38,073 # 0x60 - - - - - - - - - - - - - - - - 2023-06-22 18:51:38,112 # 0x70 - - - - - - - - R R R R R R R R > 2023-06-22 18:52:54,462 # Exiting Pyterm ``` #### tests/periph/pwm ``` tests/periph/pwm$ BOARD=atmega1284p make -j64 clean all | grep '^ ' && BOARD=atmega1284p AVRDUDE_PROGRAMMER='usbasp -F' make flash 2>&1 | grep -- 'of flash' && BOARD=atmega1284p PORT=/dev/ttyACM0 make term text data bss dec hex filename 15382 896 1093 17371 43db /home/hugues/github/cpu_atmega_common/RIOT/tests/periph/pwm/bin/atmega1284p/tests_pwm.elf avrdude: 16278 bytes of flash written avrdude: 16278 bytes of flash verified /home/hugues/github/cpu_atmega_common/RIOT/dist/tools/pyterm/pyterm -p "/dev/ttyACM0" -b "9600" Twisted not available, please install it if you want to use pyterm's JSON capabilities 2023-06-22 18:54:32,308 # Connect to serial port /dev/ttyACM0 Welcome to pyterm! Type '/exit' to exit. 2023-06-22 18:54:33,310 # 2023-06-22 18:54:33,312 # main(): This is RIOT! (Version: 2020.07-devel-15351-gc5f75c-cpu/atmega_common) 2023-06-22 18:54:33,312 # PWM peripheral driver test 2023-06-22 18:54:33,313 # > osci 2023-06-22 18:54:39,105 # osci 2023-06-22 18:54:39,106 # 2023-06-22 18:54:39,121 # RIOT PWM test 2023-06-22 18:54:39,177 # Connect an LED or scope to PWM pins to see something. 2023-06-22 18:54:39,178 # 2023-06-22 18:54:39,216 # Available PWM device between 0 and 1 2023-06-22 18:54:39,244 # Initialized PWM_0 @ 488Hz. 2023-06-22 18:54:39,273 # Initialized PWM_1 @ 976Hz. 2023-06-22 18:54:39,274 # 2023-06-22 18:54:39,313 # Letting the PWM pins oscillate now... 2023-06-22 18:54:45,655 # Exiting Pyterm ``` #### tests/periph/spi ``` tests/periph/spi$ BOARD=atmega1284p make -j64 clean all | grep '^ ' && BOARD=atmega1284p AVRDUDE_PROGRAMMER='usbasp -F' make flash 2>&1 | grep -- 'of flash' && BOARD=atmega1284p PORT=/dev/ttyACM0 make term text data bss dec hex filename 19240 1402 2317 22959 59af /home/hugues/github/cpu_atmega_common/RIOT/tests/periph/spi/bin/atmega1284p/tests_spi.elf avrdude: 20642 bytes of flash written avrdude: 20642 bytes of flash verified /home/hugues/github/cpu_atmega_common/RIOT/dist/tools/pyterm/pyterm -p "/dev/ttyACM0" -b "9600" Twisted not available, please install it if you want to use pyterm's JSON capabilities 2023-06-22 18:58:12,394 # Connect to serial port /dev/ttyACM0 Welcome to pyterm! Type '/exit' to exit. 2023-06-22 18:58:13,396 # 2023-06-22 18:58:13,398 # main(): This is RIOT! (Version: 2020.07-devel-15351-gc5f75c-cpu/atmega_common) 2023-06-22 18:58:13,398 # Manual SPI peripheral driver test (see README.md) 2023-06-22 18:58:13,399 # There are 1 SPI devices configured for your platform. init 0 0 4 2023-06-22 18:58:32,086 # init 0 0 4 2023-06-22 18:58:32,161 # Trying to initialize SPI_DEV(0): mode: 0, clk: 4, cs_port: 0, cs_pin: 0 2023-06-22 18:58:32,270 # (if below the program crashes with a failed assertion, then it means the configuration is not supported) 2023-06-22 18:58:32,280 # Success. bench 2023-06-22 18:58:41,590 # bench 2023-06-22 18:58:41,644 # ### Running some benchmarks, all values in [us] ### 2023-06-22 18:58:41,682 # ### Test Transfer time user time 2023-06-22 18:58:41,683 # 2023-06-22 18:58:41,755 # 1 - write 1000 times 1 byte: 28456 28640 2023-06-22 18:58:41,827 # 2 - write 1000 times 2 byte: 28184 28352 2023-06-22 18:58:42,454 # 3 - write 1000 times 100 byte: 579528 579704 2023-06-22 18:58:42,563 # 4 - write 1000 times 1 byte to register: 54080 54256 2023-06-22 18:58:42,674 # 5 - write 1000 times 2 byte to register: 56720 56888 2023-06-22 18:58:43,340 # 6 - write 1000 times 100 byte to register: 608152 608320 2023-06-22 18:58:43,412 # 7 - read 1000 times 2 byte: 28304 28480 2023-06-22 18:58:44,025 # 8 - read 1000 times 100 byte: 567408 567576 2023-06-22 18:58:44,138 # 9 - read 1000 times 2 byte from register: 56840 57016 2023-06-22 18:58:44,793 # 10 - read 1000 times 100 byte from register: 596024 596200 2023-06-22 18:58:44,868 # 11 - transfer 1000 times 2 byte: 28336 28512 2023-06-22 18:58:45,510 # 12 - transfer 1000 times 100 byte: 592128 592304 2023-06-22 18:58:45,625 # 13 - transfer 1000 times 2 byte to register: 56960 57136 2023-06-22 18:58:46,306 # 14 - transfer 1000 times 100 byte to register:620744 620920 2023-06-22 18:58:46,373 # 15 - acquire/release 1000 times: 20960 21136 2023-06-22 18:58:46,879 # -- - SUM: 3922824 3925440 2023-06-22 18:58:46,880 # 2023-06-22 18:58:46,907 # ### All runs complete ### > 2023-06-22 18:58:54,706 # Exiting Pyterm ``` I always wonder how fast it really goes: - #16727 - #18374 #### tests/periph/timer ``` tests/periph/timer$ BOARD=atmega1284p make -j64 clean all | grep '^ ' && BOARD=atmega1284p AVRDUDE_PROGRAMMER='usbasp -F' make flash 2>&1 | grep -- 'of flash' && BOARD=atmega1284p PORT=/dev/ttyACM0 make term text data bss dec hex filename 8968 274 1032 10274 2822 /home/hugues/github/cpu_atmega_common/RIOT/tests/periph/timer/bin/atmega1284p/tests_timer.elf avrdude: 9242 bytes of flash written avrdude: 9242 bytes of flash verified /home/hugues/github/cpu_atmega_common/RIOT/dist/tools/pyterm/pyterm -p "/dev/ttyACM0" -b "9600" Twisted not available, please install it if you want to use pyterm's JSON capabilities 2023-06-22 19:00:15,136 # Connect to serial port /dev/ttyACM0 Welcome to pyterm! Type '/exit' to exit. 2023-06-22 19:00:16,138 # 2023-06-22 19:00:16,139 # Help: Press s to start test, r to print it is ready s 2023-06-22 19:00:31,118 # START 2023-06-22 19:00:31,200 # main(): This is RIOT! (Version: 2020.07-devel-15351-gc5f75c-cpu/atmega_common) 2023-06-22 19:00:31,201 # 2023-06-22 19:00:31,230 # Test for peripheral TIMERs 2023-06-22 19:00:31,231 # 2023-06-22 19:00:31,251 # Available timers: 2 2023-06-22 19:00:31,252 # 2023-06-22 19:00:31,270 # Testing TIMER_0: 2023-06-22 19:00:31,306 # TIMER_0: initialization successful 2023-06-22 19:00:31,324 # TIMER_0: stopped 2023-06-22 19:00:31,356 # TIMER_0: set channel 0 to 5000 2023-06-22 19:00:31,390 # TIMER_0: set channel 1 to 10000 2023-06-22 19:00:31,408 # TIMER_0: starting 2023-06-22 19:00:31,482 # TIMER_0: channel 0 fired at SW count 1247 - init: 1247 2023-06-22 19:00:31,547 # TIMER_0: channel 1 fired at SW count 2488 - diff: 1241 2023-06-22 19:00:31,551 # 2023-06-22 19:00:31,568 # Testing TIMER_1: 2023-06-22 19:00:31,605 # TIMER_1: initialization successful 2023-06-22 19:00:31,622 # TIMER_1: stopped 2023-06-22 19:00:31,655 # TIMER_1: set channel 0 to 5000 2023-06-22 19:00:31,688 # TIMER_1: set channel 1 to 10000 2023-06-22 19:00:31,707 # TIMER_1: starting 2023-06-22 19:00:31,780 # TIMER_1: channel 0 fired at SW count 1247 - init: 1247 2023-06-22 19:00:31,846 # TIMER_1: channel 1 fired at SW count 2488 - diff: 1241 2023-06-22 19:00:31,849 # 2023-06-22 19:00:31,864 # TEST SUCCEEDED 2023-06-22 19:00:31,939 # { "threads": [{ "name": "idle", "stack_size": 128, "stack_used": 86 }]} 2023-06-22 19:00:32,015 # { "threads": [{ "name": "main", "stack_size": 640, "stack_used": 120 }]} 2023-06-22 19:00:34,259 # Exiting Pyterm ``` #### tests/periph/uart ``` tests/periph/uart$ BOARD=atmega1284p make -j64 clean all | grep '^ ' && BOARD=atmega1284p AVRDUDE_PROGRAMMER='usbasp -F' make flash 2>&1 | grep -- 'of flash' && BOARD=atmega1284p PORT=/dev/ttyACM0 make term text data bss dec hex filename 15918 1044 2000 18962 4a12 /home/hugues/github/cpu_atmega_common/RIOT/tests/periph/uart/bin/atmega1284p/tests_uart.elf avrdude: 16962 bytes of flash written avrdude: 16962 bytes of flash verified /home/hugues/github/cpu_atmega_common/RIOT/dist/tools/pyterm/pyterm -p "/dev/ttyACM0" -b "9600" Twisted not available, please install it if you want to use pyterm's JSON capabilities 2023-06-22 19:01:25,894 # Connect to serial port /dev/ttyACM0 Welcome to pyterm! Type '/exit' to exit. 2023-06-22 19:01:26,896 # 2023-06-22 19:01:26,898 # main(): This is RIOT! (Version: 2020.07-devel-15351-gc5f75c-cpu/atmega_common) 2023-06-22 19:01:26,898 # 2023-06-22 19:01:26,899 # Manual UART driver test application 2023-06-22 19:01:26,899 # =================================== 2023-06-22 19:01:26,900 # This application is intended for testing additional UART 2023-06-22 19:01:26,900 # interfaces, that might be defined for a board. The 'primary' UART 2023-06-22 19:01:26,901 # interface is tested implicitly, as it is running the shell... 2023-06-22 19:01:26,901 # 2023-06-22 19:01:26,902 # When receiving data on one of the additional UART interfaces, this 2023-06-22 19:01:26,902 # data will be outputted via STDIO. So the easiest way to test an 2023-06-22 19:01:26,903 # UART interface, is to simply connect the RX with the TX pin. Then 2023-06-22 19:01:26,904 # you can send data on that interface and you should see the data 2023-06-22 19:01:26,904 # being printed to STDOUT 2023-06-22 19:01:26,904 # 2023-06-22 19:01:26,904 # NOTE: all strings need to be '\n' terminated! 2023-06-22 19:01:26,904 # 2023-06-22 19:01:26,909 # UARD_DEV(0): test uart_poweron() and uart_poweroff() -> [OK] 2023-06-22 19:01:26,910 # 2023-06-22 19:01:26,921 # UART INFO: 2023-06-22 19:01:26,958 # Available devices: 2 2023-06-22 19:01:27,004 # UART used for STDIO (the shell): UART_DEV(0) 2023-06-22 19:01:27,006 # init 1 9600 2023-06-22 19:01:50,464 # init 1 9600 send 1 ping 2023-06-22 19:04:12,912 # send 1 ping 2023-06-22 19:04:12,934 # UART_DEV(1) TX: ping > 2023-06-22 19:04:12,973 # Success: UART_DEV(1) RX: [ping]\n 2023-06-22 19:04:23,894 # Exiting Pyterm ```` ### Issues/PRs references Depends on PR: - #19751 Co-authored-by: Hugues Larrive <hlarrive@pm.me>
There was a problem hiding this comment.
Some general comments:
-
Instead of making parameter declarations non-const, the SPI frequency in the parameter set should be considered as requested frequency, but the actual SPI frequency should then be stored in the corresponding device descriptor. Removing the
constkeyword from the parameter set declaration has the disadvantage that the parameter set variable (that can be pretty large) is then placed in RAM instead of ROM. -
I am very impressed how many drivers/packages have to be changed because of the impact of this API change, so I wonder if this is really the right approach. Backwards compatibility is essential for user acceptance. Instead of changing all the hundreds of drivers, you should think again about using an approach as already suggested by @maribu in #16727 (comment). The PR is already pretty large and still not complete. It is so large that can't almost handle it in my browser. The approach suggested by @maribu would allow to split the PR into the API change and driver changes step by step.
Also the approach mentioned by @maribu in #16727 (comment) to cache the last used SPI frequency settings in the backends and to change the settings only if another frequency is used inspi_acquirewouldn't be a problem and easy to implement. -
I'm also wondering whether the change of the name from
spi_clktospi_freqin the parameter sets are really necessary in the first step.
|
@gschorcht Thank you very much for your comments. About the const modifiers, I corrected the drivers from which I had removed it but there are others where I had left it without it causing a compile error so I'll have to see why... The problem with caching the last used frequency settings in the backend is the case where several devices with different frequencies are used alternatively. Not only this can be a performance killer on architectures with costly prescaler computing, but it's also detrimental to real time, since spi_acquire will take more or less time depending on whether or not another thread has accessed the bus just before. That's why I'm convinced that the caching must be done in each device driver so that spi_acquire remains deterministic. User acceptance shouldn't be a major issue since this is bus driver is primarily used through other device drivers. It should be transparent in most cases except for those who use their own driver without sharing it. |
|
Sorry for the merge conflict with MSP430. I started rework all periph drivers for that MCU anyway, e.g. it currently only supports a single SPI bus (and at least the MSP430 F2xx family with the USCI based SPI can support multiple SPI interfaces). (And I also would like to look into sharing the USART/USCI peripheral providing the UART/SPI/I2C in the way it is done in nRF5x; right now the MSP430 x1xx family can use one UART plus either one I2C or one SPI, which frankly is pretty scarce.) I think this PR should just drop SPI support for the MSP430 and stop worrying about that exotic platform. I will eventually add new SPI, UART and I2C implementations anyway. And |
benpicco
left a comment
There was a problem hiding this comment.
I really don't understand the rationale behind the .spi_clk -> .spi_freq name change.
On most(?) platforms, SPI_CLK_5MHZ is already defined to be MHZ(5) today, so this isn't even a semantic change, but creates a lot of busywork.
I mostly agree with that. Still, users with drivers used as external modules will feel some pain. Given that 99% of the use cases will either use a single SPI bus or all SPI buses are compatible with the same prescaler settings, providing the backward compatible constants would turn this into a non-breaking API change except for 1% of the use cases. (It might also be possible to pre-calculate prescaler settings for all SPI buses in a In addition to not breaking external modules (for at least 99% of the cases), this would also allow to update the drivers independently as follow ups. This would allow distributing the work (also the review tasks) on more shoulders. Just to be sure I'm not misunderstood: I'm all in for phasing out |
| typedef struct { | ||
| int err; /**< Error code indicating the success or failure of the | ||
| * operation */ | ||
| uword_t clk; /**< SPI clock configuration */ | ||
| } spi_clk_t; |
There was a problem hiding this comment.
Combining an error code with the clock configuration in a struct looks pretty non-idiomatic C to me. Rather an int spi_get_clk(spi_clk_t *dest, spi_t bus, uint32_t freq_hz) would be more idiomatic to me. But that would conflict with my proposed mode of backward compatibility.
But to be honest: After having seen lots of users of peripheral APIs with return code checking and graceful error handling intended to be done by the caller, I lost all hope that driver developers will ever do this correctly. If spi_get_clk() would just assert() sane settings, we likely get better error handling for less bytes in .text.
Also, the only way to incorrectly call spi_get_clk() to my understanding is calling it with a non-existing value for spi_t bus or with a frequency that is so low that no prescaler can be found. The former clearly is a bug on the caller side, the latter is also difficult to recover from at runtime: If the device attached to a given hardware SPI bus and that bus just cannot generate a frequency compatible with that device, other than falling back to bit-baning SPI in software I have no idea to handle this at runtime. And I'd rather have the application developer than explicitly use the soft SPI than falling back at runtime.
There was a problem hiding this comment.
Rather an
int spi_get_clk(spi_clk_t *dest, spi_t bus, uint32_t freq_hz)would be more idiomatic to me.
👍
If I am correct, the only error code used in spi_clk_t::err is -EDOM? And probably no platform will return 0 as spi_clk_t::clk from spi_get_clk. So why not use as return value 0 in case of error and the clock different from 0 in case of success?
There was a problem hiding this comment.
The qn908x platform can return 0:
/* The value stored in DIV is always (divider - 1), meaning that a value of
* 0 divides by 1. */
return (spi_clk_t){ .clk = (uint16_t)(divider - 1) };I guess I should not have changed the description from "Opaque type that contains an SPI clock configuration".
The user should not worry about what it contains but just use it to pass the value obtained from spi_get_clk to spi_acquire or spi_get_freq (which returns an int containing the actual frequency value or -EDOM in the idiomatic way).
I will put a better description in the documentation.
There was a problem hiding this comment.
The qn908x platform can return 0:
🤔 too bad
This is not a name change, spi_freq has been added. The problem is that spi_acquire needs a prescaler or divider value to be applied in MCU registers, which basically requires the source clock to be divided by the expected frequency, and that doing this computation at each acquire is a big waste of resources. Ideally spi_clk should be renamed spi_div or spi_psc or something like that (which is more related to a period than a frequency) but this won't be the case for all platforms even after this PR so I've left spi_clk for now. As asking the user to provide a value ready to be applied to the registers is not an option, we provide a getter function that computes this parameter from an expected frequency. We also provide a convenience getter function that returns the actual resulting frequency from this parameter. So each driver can get the required clock parameter during initialization and store it for later uses. With this approach you can share the bus between several devices with different frequencies and access them in turn without any overhead. This was not a marginal issue, as great efforts were made to mitigate it in some major implementations such as stm32. |
The problem is not the use of several spi buses, as their number is known at compile time, so we could easily plan to store one value per bus at compile time. The problem arises when several different devices use the same bus, i.e. a storage device and a network device. |
but in that case all real-time assumptions are out of the window already as any of the two devices might block the bus for an arbitrary amount of time. |
Not really. Real time capable doesn't mean fast, just "in time". Reducing the overhead of IMO reducing the overhead of |
tests/periph_spi: printing and testing SPI clock rates drivers/periph_spi: change API of spi_acquire (from RIOT-OS#15904) drivers/periph_spi: add the `bus` parameter to spi_get_*() This was necessary for implementations where multiple devices can have different clock sources. This broke the macros SPI_CLK_* that were reverted to an enum. periph/spi: adapted to the new API Arbitrary speed support was added to all implementations where it was missing. 2023-06: - rebased on current master - some backports from 2022 RIOT-OS#18374 - 3 new implementations adapted (gd32v, rpx0xx, and esp32) - minial frequency asserts was replaced by return codes - useless upper frequency bounding removed from many implementations - SPI_DIV_UP was replaced by the new DIV_ROUND_UP from macros/math.h - driver clock configuration caching was removed from implementations where it exists because it should be done at application level with this new API - br computation was simplified for stm32 / gd32v as performace optimisation is no longer needed at this level and the inaccuracy of the fixed point arithmetic was unreliable for frequencies requested lower but close to resulting frequencies
| if (freq > apb_clk / 5) { | ||
| LOG_TAG_ERROR("spi", "APB clock rate (%"PRIu32" Hz) has to be at " | ||
| "least 5 times SPI clock rate (%"PRIu32" Hz)\n", | ||
| apb_clk, freq); |
There was a problem hiding this comment.
@gschorcht I moved this code as is from spi_acquire but I wonder why APB clock rate has to be at least 5 times SPI clock rate. From the reference manual section 7.4: "The maximum output clock frequency of ESP32 GP-SPI master is f apb /2" and even "When the SPI_CLK_EQU_SYSCLK bit in register SPI_CLOCK_REG is set to 1, and the other bits are set to 0, SPI output clock frequency is f apb."
There was a problem hiding this comment.
This is what I had to learn when I was implementing the support for core clock frequencies lower than 80 MHz down to 2 MHz. For example with
CFLAGS='-DCONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=40' BOARD=esp32-wroom-32 make -j8 -C tests/periph/spi flash
and wired MOSI-MISO I get for 10 MHz:
> init 0 0 4 0 5
> send hallo
Sent bytes
0 1 2 3 4
0x68 0x65 0x6c 0x6c 0x6f
h e l l o
Received bytes
0 1 2 3 4
0x34 0x32 0xb6 0x36 0x37
4 2 ?? 6 7
while it works for 5 MHz.
I have the same problem for 2 MHz core clock frequency. While it works for 400 kHz SPI clock frequency, it doesn't work for 1 MHz SPI clock frequency.
That's why I said that the APB clock which corresponds to the core clock for frequencies lower than 80 MHz has to at least 5 times the SPI clock frequency.
There was a problem hiding this comment.
Note that 0x3432b63637 = 0x68656c6c6f >> 1. I observed the same issue on esp8266 for the highest frequency (80MHz with spi_clk_equ_sysclk).
It seems to be linked to spi_miso_delay_mode which should be set to 0 for frequencies higher than clkapb/4 according to the manual section 7.4.2.
Contribution description
Re-open #14768 because I needed it yesterday...
The current test does not allow to test all baud rates supported by the hardware and driver.
On the nucleo-f334r8 board:
It was not possible to make tests with others supported speeds (1.125 MHz, 2.25 MHz, 18 MHz, and 36 MHz).
One might think that this is a limitation of the RIOT SPI driver but this is no longer the case for the STM32 CPU family...
In order to not poke CPU configuration in application / test code it was first proposed that the spi_acquire() function return the resulting speed in #15904 but this nullified the benefit of #15902.
Choosing the right prescaler value for an arbitrary speed is also a time-consuming operation which is not needed to be performed each time the bus is acquired.
The stm32 implementation used fixed-point arithmetic and caching to minimize performance impact but caching is inefficient in some use cases i.e. two peripherals with different speed sharing the same bus.
Two functions have been added to the API:
I added arbitrary speed in all implementations where it was missing.
I had to add a
busparameter to thespi_get_*()functions because it was necessary for implementations where multiple devices can have different clock sources ie sam0 and stm32. This broke theSPI_CLK_*macros that were reverted to an enum.For efm32 (which use the gecko SDK) and lm4f120 (which use the stellaris peripheral driver library) implementations
spi_clk_get()computes the prescaler as in the SDK / library but return the actual frequency (no modification tospi_acquire().Drops msp430 support for now (#16727 (comment))
Testing procedure
Build tests/periph_spi on all hardware architectures
msp430fxyz (z1)Test frequency printing and check there with an oscilloscope
msp430fxyz - possible frequencies: SMCLK/ [1|2]..65535*My equipment does not allow me to measure frequencies above 15 MHz.
Issues/PRs references
Include #15902. Include and improve #16811. See also #15904.