Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SPI1 and USB peripherals conflict in stm32g0b1 #2166

Closed
cbruiz opened this issue Nov 9, 2023 · 6 comments
Closed

SPI1 and USB peripherals conflict in stm32g0b1 #2166

cbruiz opened this issue Nov 9, 2023 · 6 comments

Comments

@cbruiz
Copy link
Contributor

cbruiz commented Nov 9, 2023

Hello.

First of all thank you for this huge contribution.
I'm starting a project leveraging embassy and found an issue with SPI1 and USB in STM32G0B1RETx MCU:
When I enable SPI1, even tough not using it, USB driver gets internally "stall" forever
However:

  • If I do not enable SPI1, USB works properly,
  • SPI1 works properly despite USB is enabled and not working (stalled).
  • I din't experiment the issue with other peripherals.
  • I had to enable manually HSI48 and setup Usbsel as other few cases I saw due the RCC initialization in which you are actively progressing.

In order to clearly reproduce and investigate, I just forked and created this branch with your traditional USB example: https://github.com/cbruiz/embassy/tree/stm32g0-usb_spi-rev/examples/stm32g0b1
commit ref: cbruiz@3aa632f

This example has a dummy feature: "enable-spi". When enabled (even though not using SPI1 at all, the issue is always reproduced).

Unfortunately, I run out of ideas about how to deal with it. I wouldn't mind to test or try anything you can suggest. Or maybe it's me that I made a mistake in the RCC config...? (Not an expert, sorry). Thank you in advance.

Demo

With SPI1 -> Fine

I execute the stuff in the device and USB works perfectly.
Log in trace level:

/Users/cbruiz/.cargo/bin/cargo run --color=always --package embassy-stm32g0b1-examples --bin usb_serial_plus_spi
    Finished dev [unoptimized + debuginfo] target(s) in 0.12s
     Running `probe-rs run --chip STM32G0B1RETx target/thumbv6m-none-eabi/debug/usb_serial_plus_spi`
     Erasing sectors ✔ [00:00:02] [################################################################################] 128.00 KiB/128.00 KiB @ 48.16 KiB/s (eta 0s )
 Programming pages   ✔ [00:00:04] [################################################################################] 127.00 KiB/127.00 KiB @ 26.62 KiB/s (eta 0s )    Finished in 7.454s
0.000000 TRACE BDCR ok: 00008200
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.000000 DEBUG rcc: Clocks { sys: Hertz(64000000), pclk1: Hertz(64000000), pclk1_tim: Hertz(64000000), hclk1: Hertz(64000000), rtc: Some(Hertz(32000)) }
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:130
0.000030 INFO Hello World!
└─ src/bin/usb_serial_plus_spi.rs:55
0.150451 TRACE allocating type=Interrupt mps=8 interval_ms=255, dir=In
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.150939 TRACE   index=1 addr=64 len=8
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.151397 TRACE allocating type=Bulk mps=64 interval_ms=0, dir=Out
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.151855 TRACE   len_bits = 8400
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.152130 TRACE   index=2 addr=72 len=64
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.152557 TRACE allocating type=Bulk mps=64 interval_ms=0, dir=In
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.153015 TRACE   index=2 addr=136 len=64
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.153503 INFO USB: device_descriptor used: 18
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:143
0.153778 INFO USB: config_descriptor used: 70
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:143
0.154052 INFO USB: bos_descriptor used: 12
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:143
0.154327 INFO USB: msos_descriptor used: 0
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:143
0.154571 INFO USB: control_buf size: 64
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:143
0.154876 TRACE allocating type=Control mps=64 interval_ms=0, dir=Out
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.155303 TRACE   len_bits = 8400
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.155548 TRACE   index=0 addr=200 len=64
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.155975 TRACE allocating type=Control mps=64 interval_ms=0, dir=In
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.156402 TRACE   index=0 addr=264 len=64
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.156829 TRACE enabled
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.157196 TRACE usb: power detected
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:117
0.157409 TRACE SETUP read waiting
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.157623 TRACE wait_enabled OUT WAITING
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.159973 TRACE usb: suspend
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:117
0.502593 TRACE usb: resume
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:117
0.502838 TRACE SETUP read waiting
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.512603 TRACE RESET
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.513061 TRACE usb: reset
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:117
0.513336 TRACE SETUP read waiting
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.535400 TRACE READ DONE, rx_len = 8
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.535705 TRACE SETUP read ok
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.535949 TRACE control request: Request { direction: Out, request_type: Standard, recipient: Device, request: 5, value: 2, index: 0, length: 0 }
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:117
0.536407 TRACE   control out data: []
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:117
0.536743 TRACE control: accept
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.536926 TRACE control: accept WAITING
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.537139 TRACE control: accept OK
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.537353 TRACE setting addr: 2
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.537628 TRACE SETUP read waiting
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.540618 TRACE READ DONE, rx_len = 8
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.540954 TRACE SETUP read ok
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.541168 TRACE control request: Request { direction: In, request_type: Standard, recipient: Device, request: 6, value: 256, index: 0, length: 8 }
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:117
0.541717 TRACE control: data_in
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.541900 TRACE WRITE WAITING
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.542175 TRACE WRITE OK
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.542419 TRACE SETUP read waiting
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.544952 TRACE READ DONE, rx_len = 8
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.545288 TRACE SETUP read ok
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.545501 TRACE control request: Request { direction: In, request_type: Standard, recipient: Device, request: 6, value: 256, index: 0, length: 18 }
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:117
0.546051 TRACE control: data_in
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.546264 TRACE WRITE WAITING
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.546569 TRACE WRITE OK
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.546813 TRACE SETUP read waiting
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.548980 TRACE READ DONE, rx_len = 8
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.549285 TRACE SETUP read ok
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.549499 TRACE control request: Request { direction: In, request_type: Standard, recipient: Device, request: 6, value: 770, index: 1033, length: 2 }
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:117
0.550384 TRACE control: data_in
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.550598 TRACE WRITE WAITING
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.550842 TRACE WRITE OK
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.551055 TRACE SETUP read waiting
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.554290 TRACE SETUP read ok
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.554504 TRACE control request: Request { direction: In, request_type: Standard, recipient: Device, request: 6, value: 770, index: 1033, length: 38 }
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:117
0.555389 TRACE control: data_in
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.555603 TRACE WRITE WAITING
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.556030 TRACE WRITE OK
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.556304 TRACE SETUP read waiting
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.556976 TRACE READ DONE, rx_len = 8
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.557281 TRACE SETUP read ok
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.557525 TRACE control request: Request { direction: In, request_type: Standard, recipient: Device, request: 6, value: 769, index: 1033, length: 2 }
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:117
0.558227 TRACE control: data_in
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.558441 TRACE WRITE WAITING
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.558685 TRACE WRITE OK
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.558959 TRACE SETUP read waiting
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.560974 TRACE READ DONE, rx_len = 8
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.561279 TRACE SETUP read ok
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.561523 TRACE control request: Request { direction: In, request_type: Standard, recipient: Device, request: 6, value: 769, index: 1033, length: 16 }
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:117
0.562225 TRACE control: data_in
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.562408 TRACE WRITE WAITING
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.562744 TRACE WRITE OK
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.562988 TRACE SETUP read waiting
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.564971 TRACE READ DONE, rx_len = 8
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.565277 TRACE SETUP read ok
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.565521 TRACE control request: Request { direction: In, request_type: Standard, recipient: Device, request: 6, value: 771, index: 1033, length: 2 }
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:117
0.566223 TRACE control: data_in
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.566406 TRACE WRITE WAITING
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.566650 TRACE WRITE OK
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.566925 TRACE SETUP read waiting
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.568023 TRACE READ DONE, rx_len = 8
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.568328 TRACE SETUP read ok
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.568542 TRACE control request: Request { direction: In, request_type: Standard, recipient: Device, request: 6, value: 771, index: 1033, length: 14 }
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:117
0.569244 TRACE control: data_in
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.569458 TRACE WRITE WAITING
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.569763 TRACE WRITE OK
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.570007 TRACE SETUP read waiting
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.571990 TRACE READ DONE, rx_len = 8
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.572296 TRACE SETUP read ok
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.572540 TRACE control request: Request { direction: In, request_type: Standard, recipient: Device, request: 6, value: 3840, index: 0, length: 5 }
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:117
0.573089 TRACE control: data_in
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.573272 TRACE WRITE WAITING
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.573547 TRACE WRITE OK
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.573760 TRACE SETUP read waiting
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.575988 TRACE READ DONE, rx_len = 8
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.576293 TRACE SETUP read ok
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.576507 TRACE control request: Request { direction: In, request_type: Standard, recipient: Device, request: 6, value: 3840, index: 0, length: 12 }
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:117
0.577056 TRACE control: data_in
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.577270 TRACE WRITE WAITING
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.577545 TRACE WRITE OK
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.577819 TRACE SETUP read waiting
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.578979 TRACE READ DONE, rx_len = 8
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.579284 TRACE SETUP read ok
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.579498 TRACE control request: Request { direction: In, request_type: Standard, recipient: Device, request: 6, value: 512, index: 0, length: 9 }
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:117
0.580047 TRACE control: data_in
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.580261 TRACE WRITE WAITING
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.580535 TRACE WRITE OK
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.580780 TRACE SETUP read waiting
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.582977 TRACE READ DONE, rx_len = 8
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.583312 TRACE SETUP read ok
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.583526 TRACE control request: Request { direction: In, request_type: Standard, recipient: Device, request: 6, value: 512, index: 0, length: 70 }
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:117
0.584075 TRACE control: data_in
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.584259 TRACE WRITE WAITING
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.584808 TRACE WRITE OK
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.585052 TRACE control: data_in
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.585235 TRACE WRITE WAITING
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.585510 TRACE WRITE OK
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.585784 TRACE SETUP read waiting
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.588470 TRACE READ DONE, rx_len = 8
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.588775 TRACE SETUP read ok
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.588989 TRACE control request: Request { direction: Out, request_type: Standard, recipient: Device, request: 9, value: 1, index: 0, length: 0 }
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:117
0.589477 TRACE   control out data: []
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:117
0.589782 DEBUG SET_CONFIGURATION: configured
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:130
0.590362 TRACE set_enabled EndpointAddress(81) true
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.590667 TRACE EPR before: 0601
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.591003 TRACE EPR after: 0621
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.591400 TRACE set_enabled EndpointAddress(2) true
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.591735 TRACE EPR before: 0002
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.592041 TRACE EPR after: 3002
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.592407 TRACE set_enabled EndpointAddress(82) true
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.592742 TRACE EPR before: 3002
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.593048 TRACE EPR after: 3022
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.593353 TRACE control: accept
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.593536 TRACE control: accept WAITING
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.593780 TRACE wait_enabled OUT OK
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.593994 INFO Connected
└─ src/bin/usb_serial_plus_spi.rs:103
0.594207 TRACE READ WAITING, buf.len() = 64
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.594604 TRACE control: accept OK
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.838134 TRACE READ DONE, rx_len = 8
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.838470 TRACE SETUP read ok
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.838684 TRACE control request: Request { direction: In, request_type: Standard, recipient: Device, request: 6, value: 768, index: 0, length: 255 }
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:117
0.839233 TRACE control: data_in
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.839416 TRACE WRITE WAITING
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.839660 TRACE WRITE OK
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.839965 TRACE SETUP read waiting
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117

With SPI1 -> USB stalled

I execute the stuff in the device and USB gets stalled at this point in the initialization (if I'm not wrong):

async fn wait_enabled(&mut self) {
.

Log in trace level:

/Users/cbruiz/.cargo/bin/cargo run --color=always --features enable-spi --package embassy-stm32g0b1-examples --bin usb_serial_plus_spi
    Finished dev [unoptimized + debuginfo] target(s) in 0.13s
     Running `probe-rs run --chip STM32G0B1RETx target/thumbv6m-none-eabi/debug/usb_serial_plus_spi`
     Erasing sectors ✔ [00:00:02] [################################################################################] 140.00 KiB/140.00 KiB @ 48.00 KiB/s (eta 0s )
 Programming pages   ✔ [00:00:05] [################################################################################] 139.00 KiB/139.00 KiB @ 26.72 KiB/s (eta 0s )    Finished in 8.147s
0.000000 TRACE BDCR ok: 00008200
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.000000 DEBUG rcc: Clocks { sys: Hertz(64000000), pclk1: Hertz(64000000), pclk1_tim: Hertz(64000000), hclk1: Hertz(64000000), rtc: Some(Hertz(32000)) }
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:130
0.000030 INFO Hello World!
└─ src/bin/usb_serial_plus_spi.rs:55
0.150573 TRACE allocating type=Interrupt mps=8 interval_ms=255, dir=In
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.151062 TRACE   index=1 addr=64 len=8
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.151519 TRACE allocating type=Bulk mps=64 interval_ms=0, dir=Out
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.151977 TRACE   len_bits = 8400
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.152221 TRACE   index=2 addr=72 len=64
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.152679 TRACE allocating type=Bulk mps=64 interval_ms=0, dir=In
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.153137 TRACE   index=2 addr=136 len=64
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.153625 INFO USB: device_descriptor used: 18
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:143
0.153900 INFO USB: config_descriptor used: 70
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:143
0.154174 INFO USB: bos_descriptor used: 12
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:143
0.154449 INFO USB: msos_descriptor used: 0
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:143
0.154693 INFO USB: control_buf size: 64
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:143
0.154998 TRACE allocating type=Control mps=64 interval_ms=0, dir=Out
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.155426 TRACE   len_bits = 8400
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.155670 TRACE   index=0 addr=200 len=64
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.156066 TRACE allocating type=Control mps=64 interval_ms=0, dir=In
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.156494 TRACE   index=0 addr=264 len=64
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.156921 TRACE enabled
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.157287 TRACE usb: power detected
└─ /Users/cbruiz/Proyectos/embassy/embassy-usb/src/fmt.rs:117
0.157501 TRACE SETUP read waiting
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
0.157714 TRACE wait_enabled OUT WAITING
└─ /Users/cbruiz/Proyectos/embassy/embassy-stm32/src/fmt.rs:117
@Dirbaio
Copy link
Member

Dirbaio commented Nov 9, 2023

That is very strange. I don't know what's up, but here are some things you could try that maybe will give us clues:

  • HSI48 needs CRS to be enabled to be precise enough to be USB-compliant. Can you try that? (i'm not sure if it's this, in practice hsi48 always seems to work fine even with no CRS)
  • Can you try runnning USB from PLLQ instead of HSI48?
  • Can you try SPI1 on different pins? perhaps it's a pin conflict.

@cbruiz
Copy link
Contributor Author

cbruiz commented Nov 9, 2023

That is very strange. I don't know what's up, but here are some things you could try that maybe will give us clues:

  • HSI48 needs CRS to be enabled to be precise enough to be USB-compliant. Can you try that? (i'm not sure if it's this, in practice hsi48 always seems to work fine even with no CRS)
  • Can you try runnning USB from PLLQ instead of HSI48?
  • Can you try SPI1 on different pins? perhaps it's a pin conflict.

[EDIT update]

Thank you, Dario. I will try.

About the pin conflict... I think it could be something related to that.
In this code and MCU:

  • USB has: DP=PA12, DM=PA11
  • SPI1 (currently) has: SCK=PA5, MOSI=PA7, MISO=PA6
    Note: I will test others as you suggested.

My reference point is https://github.com/embassy-rs/stm32-data-generated/blob/main/data/chips/STM32G0B1RE.json
There, it seems that one possibility is that PA11 or PA12 could be set in the wrong AF. I tried to trace such stuff but gave up :-(

Aditional tests:
1: CRS, as seen in https://github.com/embassy-rs/embassy/blob/main/embassy-stm32/src/rcc/hsi48.rs (didn't help)

/* [DT2] Activate CRS **/
    {
        use embassy_stm32::peripherals::CRS;
        use embassy_stm32::rcc::low_level::RccPeripheral;
        use embassy_stm32::pac::crs::vals::Syncsrc;

        CRS::enable_and_reset();
        embassy_stm32::pac::CRS.cfgr().modify(|w| {
            w.set_syncsrc(Syncsrc::USB);
        });

        embassy_stm32::pac::CRS.cr().modify(|w| {
            w.set_autotrimen(true);
            w.set_cen(true);
        });
    }

2: SPI1 repinning (didn't work)

spi::Spi::new(p.SPI1, p.PB3, p.PB5, p.PB4,
                      p.DMA1_CH2, p.DMA1_CH1, config)

3: USB from PLLQ.
With:

config.rcc.mux = ClockSrc::PLL(
        // 8 / 1 * 24 / 3 = 64 MHz
        PllConfig {
            source: PllSrc::HSE(Hertz(8_000_000)),
            m: Pllm::DIV1,
            n: Plln::MUL24,
            r: Pllr::DIV3,
            // Main system clock at 64 MHz
            q: Some(Pllq::DIV4), // 8 / 1 * 24 / 4 = 48 MHz
            p: Some(Pllp::DIV4), // 8 / 1 * 24 / 4 = 48 MHz
        }
    );
    config.rcc.ahb_pre = AHBPrescaler::DIV1;
    config.rcc.apb_pre = APBPrescaler::DIV1;
    config.rcc.ls = LsConfig::default_lsi();

    let p = embassy_stm32::init(config);

and then with or without CSR, and finally...

embassy_stm32::pac::RCC.ccipr2().write(|w| {
        w.set_usbsel(embassy_stm32::pac::rcc::vals::Usbsel::PLL1_Q);
    });

.... I guess I'm not able to tackle or properly understand, because in this case despite of the setup of SPI, USB is not working
Log is reporting in a continuous cycle:

6.989837 TRACE SETUP read waiting
7.085144 TRACE usb: suspend
8.074981 TRACE usb: resume
8.075225 TRACE SETUP read waiting
8.084991 TRACE RESET
8.085449 TRACE usb: reset
8.085723 TRACE SETUP read waiting
8.193023 TRACE usb: suspend
[...]

@cbruiz
Copy link
Contributor Author

cbruiz commented Nov 12, 2023

Updated with findings. No luck so far

@cbruiz
Copy link
Contributor Author

cbruiz commented Nov 21, 2023

I found couple of details:

  • For any reason, USB is not working with PCLKQ input clock in this board.
    I saw that any of CubeMx, arduino stm32 and some 3 parties firmware using the same board are working with such setup (PLLSourceMux(HSE 8 MHz)->PLLQ->USB)
    Fortunately, HSI48 works fine in the board, so I'm progresing by using HSI48->USB as said
  • I found that USB stops responding when I activate SPI1 with SSM=1 and SSI=1, which is needed for the board wiring. Then, SPI1:
    • With SSM=1, SSI=1 -> USB gets stalled
    • With SSM=0 -> USB works but obviusly SPI does not.
    • With SSM=1, SSI=0 -> USB works but even though I tried to dynamically set SSI up and down at the begining and end of a transfer (patching embassy_stm32), SPI1 responds with an error (mode fault) at the first write.

Note: My board is an SKR Mini E3 V3. The SPI1 is wired with an SD Card, which is what I'm testing.

@cbruiz
Copy link
Contributor Author

cbruiz commented Nov 27, 2023

Hello.
It seems to be due a pin conflict and fixed by activating USB pins remap (PA12_RMP and PA11_RMP) in SYSCFG.
Findings and fixes at #2224

@cbruiz
Copy link
Contributor Author

cbruiz commented Nov 27, 2023

Not an issue in embassy at the end. right?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants