#include "spi.h" #include #include "ch573/gpio.h" #include "ch573/spi.h" #include "gpio.h" #include "sysled.h" #define MAX_SPI_FIFO 8 #define GPIO_PORT_A ch573_gpio__gpio_port_a #define GPIO_PORT_B ch573_gpio__gpio_port_b #define GPIO_PORT CH573_GPIO__GPIO_PORT_T_INTF #define GPIO_I CH573_GPIO__GPIO_T_INTF #define GPIO ch573_gpio__gpio void enable_spi(void) { gpio_enable_alternate_function(AF_SPI, 1); gpio_configure_pin(PIN_PB14, PIN_CFG_OUTPUT_20mA); gpio_configure_pin(PIN_PB12, PIN_CFG_OUTPUT_20mA); gpio_configure_pin(PIN_PB15, PIN_CFG_INPUT_PULL_DOWN); gpio_configure_pin(PIN_PA14, PIN_CFG_OUTPUT_20mA); gpio_configure_pin(PIN_PA12, PIN_CFG_OUTPUT_20mA); gpio_configure_pin(PIN_PA15, PIN_CFG_INPUT_PULL_DOWN); SPI.clock_div.set(SPI0, 25); SPI.ctrl_mod.all_clear.set(SPI0, 1); SPI.ctrl_mod.all_clear.set(SPI0, 0); SPI.ctrl_mod.pin_enable.set(SPI0, 0x7); // Set mosi and sck SPI.ctrl_cfg.auto_if.set(SPI0, 1); SPI.ctrl_cfg.dma_enable.set(SPI0, OFF); SPI.ctrl_mod.mst_sck_mod.set(SPI0, 0); } void dma_transfer(void* output_buffer, size_t len) { SPI.ctrl_mod.fifo_dir.set(SPI0, FIFO_DIR_OUTPUT); SPI.dma_beg.set(SPI0, (uint32_t)output_buffer); SPI.dma_end.set(SPI0, (uint32_t)(output_buffer + len)); SPI.total_count.set(SPI0, len); // Start DMA. SPI.ctrl_cfg.dma_enable.set(SPI0, ON); } void wait_for_dma() { while (SPI.total_count.get(SPI0) > 0) { set_sysled(1); } set_sysled(0); }