考虑到有些项目需要使用我们6629的芯片作为spi从机,但是主机的发包间隔又不可控,为了解决spi每一帧数据的衔接问题,我们可以考虑spi的链表方式,目前该驱动主要是针对6629作为spi从机,只接收。驱动详情参考附件 使用示例: #define TEST_TRANS_SIZE 4 //100 static uint8_t spi_rx_buf[TEST_TRANS_SIZE]; static uint8_t spi_rx_buf1[TEST_TRANS_SIZE]; static void spi_pinmux_init(void) { drv_pin_init(pin_cfg_cnt, sizeof(pin_cfg_cnt) / sizeof(pin_cfg_cnt[0])); memset(spi_rx_buf, 0xFF, sizeof(spi_rx_buf)); // drv_spi_transfer_int(OM_SPI0, spi_tx_buf, TEST_TRANS_SIZE, spi_rx_buf, TEST_TRANS_SIZE); // while (!int_transfer_is_done); // int_transfer_is_done = 0; } void spi_transfer_dma_ll_cb(void *om_reg, drv_event_t event, void *rcv, void *num) { if(event == DRV_GPDMA_EVENT_TERMINAL_COUNT_REQUEST) { LOG_DBG_ARRAY_EX("receive data:",rcv, (uint32_t)num); memset(rcv, 0, (uint32_t)num); } } void slave_spi_trans_dma_ll(void) { switch_96m_clk(); OM_LOG_INIT(); // evt_timer_set(&ctr_gpio_timer, 500, EVT_TIMER_REPEAT, ctr_gpio_timer_cb, NULL); LOG_INF("----------------test spi slave dma start-------------------\n"); LOG_INF("slave spi test cs = %d, clk = %d, miso = %d, mosi = %d\n", PAD_SPI0_CS, PAD_SPI0_CLK, PAD_SPI0_DI, PAD_SPI0_DIO); for (uint16_t i = 0; i < TEST_TRANS_SIZE; i++) { spi_tx_buf[i] = TEST_TRANS_SIZE - i; } spi_cfg.role = SPI_ROLE_SLAVE; spi_pinmux_init(); drv_spi_init(OM_SPI0, &spi_cfg); drv_spi_register_dma_ll_isr_callback(OM_SPI0, spi_transfer_dma_ll_cb); // 4 wire spi LOG_DBG("spi_rx_buf addr is 0x%08x, spi_rx_buf1 addr is 0x%08x\n",(uint32_t)spi_rx_buf, (uint32_t)spi_rx_buf1); drv_spi_read_dma_ll(OM_SPI0, NULL, 0, spi_rx_buf, TEST_TRANS_SIZE); drv_spi_read_dma_ll(OM_SPI0, NULL, 0, spi_rx_buf1, TEST_TRANS_SIZE); } 移植的话,可以把my_drv_spi.c替换掉默认的drv_spi.c,但是drv_spi.h还是要保留的 |
