Now studying #BL602 SPI ... Can't wait to get #PineCone driving ST7789 with #LVGL!
https://github.com/bouffalolab/bl_docs/tree/main/BL602_RM/en
#BL602 uses the new SPI Pin Names ... No more MOSI and MISO 👍
https://github.com/bouffalolab/bl_docs/tree/main/BL602_RM/en
...Wait it's still using the old terms. Should be renamed as "Controller" and "Peripheral", according to the guidelines:
https://www.oshwa.org/a-resolution-to-redefine-spi-signal-names/
Raspberry Pi Pico also uses the old SPI terms
#BL602 SPI Registers are remarkably similar to I2C Registers ... So I can reuse my I2C code for SPI 🤔
https://github.com/bouffalolab/bl_docs/tree/main/BL602_RM/en
#BL602 SPI Register Fields look similar to I2C too
https://github.com/bouffalolab/bl_docs/tree/main/BL602_RM/en
Yep #BL602 SPI is copy pasta from I2C ... Even the Register Address. Very nice! 👍
https://github.com/bouffalolab/bl_docs/tree/main/BL602_RM/en
We'll let #BL602 talk simple SPI to BME280 first ... Before talking seriously to ST7789
https://cdn.sparkfun.com/assets/learn_tutorials/4/1/9/BST-BME280_DS001-10.pdf
#BL602 SPI DMA ... Lets you specify a Linked List of Transmit / Receive operations ... That will be executed by the DMA Controller
https://github.com/lupyuen/bl_iot_sdk/blob/master/components/hal_drv/bl602_hal/hal_spi.c#L115
#BL602 SPI DMA uses simple Interrupt Handlers .... Simpler than I2C! Let's experiment with SPI DMA on BME280
https://github.com/lupyuen/bl_iot_sdk/blob/spi/components/hal_drv/bl602_hal/hal_spi.c#L749-L794
#BL602 SPI DMA is used by AliOS VFS file system ... Which is bundled with the BL602 IoT SDK
https://pine64.github.io/bl602-docs/Components/Middleware/vfs/vfs.html
But if AliOS is really a complete Embedded Operating System ... Why does #BL602 IoT SDK still need FreeRTOS? 🤔
#BL602 SPI Functions are the same as AliOS ... Time to practice my Chinese reading skills
https://help.aliyun.com/document_detail/161063.html?spm=a2c4g.11186623.6.576.391045c4bGoNKS
...But #BL602 SPI HAL doesn't implement all AliOS SPI Functions 🤔
https://github.com/lupyuen/bl_iot_sdk/blob/spi/components/hal_drv/bl602_hal/hal_spi.c#L368
Init the #BL602 SPI Port ... Looks easy
https://github.com/lupyuen/bl_iot_sdk/blob/spi/customer_app/sdk_app_spi/sdk_app_spi/demo.c#L41-L58
Nope #BL602 it's a trap! Should call "vfs_spi_init_fullname" to init the SPI port
https://github.com/lupyuen/bl_iot_sdk/blob/spi/components/hal_drv/bl602_hal/hal_spi.c#L504-L571
Another #BL602 trap! "vfs_spi_init_fullname" doesn't return the SPI Device ... It passes the SPI Device to AliOS! Let's create our own function to init the SPI Port without AliOS 🤔
https://github.com/lupyuen/bl_iot_sdk/blob/spi/components/hal_drv/bl602_hal/hal_spi.c#L504-L571
Init #BL602 SPI Port ... No more traps!
https://github.com/lupyuen/bl_iot_sdk/blob/spi/customer_app/sdk_app_spi/sdk_app_spi/demo.c#L42-L69
#BL602 SPI Data Transfer needs a "void *" parameter ... Which is cast to an "spi_ioc_transfer_t" ... That belongs to AliOS 😭
https://github.com/lupyuen/bl_iot_sdk/blob/spi/components/hal_drv/bl602_hal/hal_spi.c#L464-L502
Good Sunday Morning #PineCone #BL602 @PINE64 ... And #BME280 on SPI! Yep this looks right 👍
https://github.com/lupyuen/bl_iot_sdk/blob/spi/customer_app/sdk_app_spi/sdk_app_spi/demo.c#L49-L70
#BL602 SPI Transmit and Receive ... Hope this works 🤔
https://github.com/lupyuen/bl_iot_sdk/blob/spi/customer_app/sdk_app_spi/sdk_app_spi/demo.c#L72-L102
Our #BL602 SPI program hangs when doing data transfer 🤔
https://github.com/lupyuen/bl_iot_sdk/blob/spi/customer_app/sdk_app_spi/sdk_app_spi/demo.c
#BL602 SPI DMA Transfer is hanging inside "hal_spi_dma_trans" ... According to the debug log 🤔
https://github.com/lupyuen/bl_iot_sdk/blob/spi/components/hal_drv/bl602_hal/hal_spi.c#L472-L510
"hal_spi_dma_trans" hangs while doing #BL602 SPI DMA transfer because it's waiting for a FreeRTOS Event Group ... Which is supposed to be signalled by the DMA Interrupt Handler. Let's comment out the waiting and see what happens...
https://github.com/lupyuen/bl_iot_sdk/blob/spi/components/hal_drv/bl602_hal/hal_spi.c#L285-L348
These 2 #BL602 SPI Functions are begging me to call them ... Phew this SPI HAL is confusing 🤔
https://github.com/lupyuen/bl_iot_sdk/blob/spi/components/hal_drv/bl602_hal/hal_spi.c#L405
#BL602 SPI DMA uses a Linked List of DMA requests ... Let's dump the DMA Linked List and verify the SPI Transmit and Receive requests
https://github.com/lupyuen/bl_iot_sdk/blob/spi/components/hal_drv/bl602_hal/hal_spi.c#L160-L199
Aha #BL602 SPI DMA is now Transmitting AND Receiving! The SPI Mode was incorrect ... Got confused between the AliOS docs and the BL602 implementation 🙁
Received SPI Data is garbage though 🤔
https://github.com/lupyuen/bl_iot_sdk/blob/spi/customer_app/sdk_app_spi/sdk_app_spi/demo.c#L49-L67
Contemplating my Life Choices ... Erm whether I should use #BusPirate to sniff the #BL602 SPI Bus 🤔
...Or use a real Logic Analyser ... To debug the #BL602 SPI Bus? 🤔
https://www.seeedstudio.com/LA2016-Logic-Analyzer-p-2218.html
#PineCone and #Pinenut #BL602 recommended SPI Pins ... Let's try them
https://wiki.pine64.org/wiki/Nutcracker#Pinenut-12S_Module_information
Testing the Recommended SPI Pins for #BL602 #PineCone @ThePine64
https://wiki.pine64.org/wiki/Nutcracker#Pinenut-12S_Module_information
Nope Recommended SPI Pins for #PineCone #BL602 also don't work
https://github.com/lupyuen/bl_iot_sdk/blob/spi/customer_app/sdk_app_spi/sdk_app_spi/demo.c#L49-L67
...But now we get pretty Blue and Red Lights on #PineCone #BL602! 🤩 Time to do the SPI Protocol Analyser ... My first time ever!
https://github.com/lupyuen/bl_iot_sdk/blob/spi/customer_app/sdk_app_spi/sdk_app_spi/demo.c#L49-L67
Test the Logic Analyser with #BusPirate ... Before connecting to #BL602 and BME280
Logic Analyser connected to #BusPirate and #BME280 ... Hope this works 🤔
Logic Analyser captures SPI Data between #BusPirate and #BME280 ... So cool! 🤩 Now to capture #BL602 + BME280 and compare
#BL602 SPI Data Pins seem to be flipped ... Based on SPI data sniffed by Logic Analyser 🤔
https://github.com/lupyuen/bl_iot_sdk/blob/spi/customer_app/sdk_app_spi/sdk_app_spi/demo.c#L49-L67
Let's try 2 #BL602 SPI Transfers instead of 1 ... First SPI Transfer transmits Register ID ... Second SPI Transfer receives the result from BME280
https://github.com/lupyuen/bl_iot_sdk/blob/spi/customer_app/sdk_app_spi/sdk_app_spi/demo.c#L70-L114
#BL602 SPI Transmit seems OK but not SPI Receive ... After calling "hal_spi_init" 🤔
https://github.com/lupyuen/bl_iot_sdk/blob/spi/components/hal_drv/bl602_hal/hal_spi.c#L826-L876