GD32E230 SPI DMA通訊(讀取感測器資料)
一場疫情讓公司的生意越來越好,忙得不可開交,產品大賣特賣。結果ST的微控制器開始出現交期不穩定,供貨慢,價格翻倍。無奈之下只好從國產微控制器下手。於是就有了我的ST-GD的程式碼移植。
一、SPI初始化
/************************************************
函式名稱 : rcu_config
功 能 : RCU時鐘配置
參 數 : 無
返 回 值 : 無
作 者 : Mico
*************************************************/
void rcu_config(void)
{
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_DMA);
rcu_periph_clock_enable(RCU_SPI0);
}
/************************************************
函式名稱 : gpio_config
功 能 : SPI對映GPIO初始化
參 數 : 無
返 回 值 : 無
作 者 : Mico
*************************************************/
void gpio_config(void)
{
rcu_config();
/* SPI0 GPIO config: SCK/PA5, MISO/PA6, MOSI/PA7 */
gpio_af_set(GPIOB, GPIO_AF_0, GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5);
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5);
gpio_output_options_set(GPIOB,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5);
gpio_bit_reset(GPIOB,GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5);
gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_15);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);
gpio_bit_set(GPIOA,GPIO_PIN_15);//拉低片選
}
/************************************************
函式名稱 : spi_config
功 能 : SPI 初始化
參 數 : 無
返 回 值 : 無
作 者 : Mico
*************************************************/
void spi_config(void)
{
spi_parameter_struct spi_init_struct;
/* deinitilize SPI and the parameters */
spi_i2s_deinit(SPI0);
spi_struct_para_init(&spi_init_struct);
/* SPI0 parameter config */
spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
spi_init_struct.device_mode = SPI_MASTER;
spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT;
spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_2EDGE;
spi_init_struct.nss = SPI_NSS_SOFT;
spi_init_struct.prescale = SPI_PSC_8;
spi_init_struct.endian = SPI_ENDIAN_MSB;
spi_init(SPI0, &spi_init_struct);
}
GD32的SPI配置和ST的方式差不多,區別就在於庫函式的封裝方式不同。
二、DMA配置
/************************************************
函式名稱 : dma_config
功 能 : SPI DMA初始化
參 數 : 無
返 回 值 : 無
作 者 : Mico
*************************************************/
void dma_config(void)
{
dma_parameter_struct dma_init_struct;
dma_struct_para_init(&dma_init_struct);
/* SPI0 transmit dma config */
dma_deinit(DMA_CH2);
dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI0);//外設基地址
dma_init_struct.memory_addr = (uint32_t)SPI_TX_BUF ;//記憶體基地址
dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL; //資料傳輸方向:記憶體到外設
dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;//外設資料寬度8位
dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT; //記憶體資料寬度8位
dma_init_struct.priority = DMA_PRIORITY_HIGH; //DMA通道傳輸軟體優先順序
dma_init_struct.number = ARRAYSIZE; //DMA通道資料傳輸數量
dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;//外設地址生成演算法模式使能
dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;//儲存器地址生成演算法模式失能
dma_init(DMA_CH2, &dma_init_struct); //初始化DMA通道2
// dma_circulation_enable(DMA_CH2); //DMA迴圈模式使能
/* SPI0 receive dma config */
dma_deinit(DMA_CH1);
dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI0);
dma_init_struct.memory_addr = (uint32_t)spi0_receive_array;
dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;
dma_init_struct.priority = DMA_PRIORITY_MEDIUM;
dma_init(DMA_CH1, &dma_init_struct);
// dma_circulation_enable(DMA_CH1);
}
三、讀取資料
/************************************************
函式名稱 : SPI_DMA_WriteReadByte
功 能 : SPI DMA讀取角度
參 數 : 無
返 回 值 : 無
作 者 : Mico
*************************************************/
void SPI_DMA_WriteReadByte(void)
{
GPIO_BC (GPIOA) = (uint32_t)GPIO_PIN_15;
SPI_CTL1(SPI0) |= (uint32_t)SPI_CTL1_DMATEN; /*SPI DMA傳送使能*/
SPI_CTL1(SPI0) |= (uint32_t)SPI_CTL1_DMAREN;/*SPI DMA接收使能*/
DMA_CHCTL(DMA_CH2) &= ~DMA_CHXCTL_CHEN; /*失能DMA通道2*/
DMA_CHCNT(DMA_CH2) = ARRAYSIZE ; /*傳輸長度*/
DMA_CHCTL(DMA_CH2) |= DMA_CHXCTL_CHEN; /*使能DMA通道2*/
dma_channel_disable(DMA_CH1); /*失能DMA通道2*/
// DMA_CHCTL(DMA_CH1) &= ~DMA_CHXCTL_CHEN;
DMA_CHCNT(DMA_CH1) = ARRAYSIZE ; /*傳輸長度*/
// DMA_CHCTL(DMA_CH1) |= DMA_CHXCTL_CHEN;
dma_channel_enable(DMA_CH1); /*使能DMA通道2*/
while(RESET == dma_flag_get(DMA_CH2,DMA_FLAG_FTF));
while(RESET == dma_flag_get(DMA_CH1,DMA_FLAG_FTF));
GPIO_BOP(GPIOA) = (uint32_t)GPIO_PIN_15;
}
依舊是ST的那個味道,一開始我用GD給的例程寫的SPI通訊,發現資料只能讀取一次。最後還是用ST的那個思想,先失能DMA通道,再重新定義資料長度,再使能DMA通道。因為我SPI的傳送和接收都是使用DMA方式,所以使用了兩個通道。通道2的傳送和通道1的接收。PA15是SPI的使能引腳。
相關文章
- SPI通訊協議 的移位暫存器資料交換過程協議
- STM32Cube-10 | 使用ADC讀取氣體感測器資料(MQ-2)MQ
- MCU的SPI通訊介面
- 20_SPI通訊外設
- 15. SPI通訊協議協議
- SPI通訊協議筆記協議筆記
- C語言讀取通達信資料C語言
- 工作筆記——CPLD與MCU通過SPI通訊筆記
- 感測器-雨滴感測器(雨刷)
- stm32 spi DMA 傳輸完成後中斷中繼續開啟DMA傳輸的注意事項,無法持續通訊的問題注意點中繼
- 小黑重灌出現指紋“無法與感測器通訊,請確認感測器已經準備就緒”之解決方法...
- STM32學習之SPI序列通訊
- 無線感測器網路與資料交換解析
- 使用Java通過POI讀取EXCEL中的資料JavaExcel
- 【easyUI】datagrid 通過formatter讀取巢狀資料UIORM巢狀
- java通過相對路徑讀取properties資料Java
- 使用perl通過thrift連線hbase讀取資料
- 請教個 jmeter 讀取資料庫商品資料,並使用讀取資料的部分欄位作為傳參的問題(感謝)JMeter資料庫
- Java讀取暫存器資料的方法Java
- 《資料探勘導論》讀後感
- 組態王與Access資料庫通訊--④資料庫測試資料庫
- 感測器透過Profinet轉Modbus閘道器與PLC通訊在生產線的應用
- 讀取CSV資料
- excel 資料讀取Excel
- 可穿戴的纖維感測器 實時動作資料監測
- 可穿戴設計的感測器技術_凱利訊
- xmltype資料類演練及讀取效率測算XML
- 《資料科學入門》讀後感資料科學
- STM32無線網路監控感測器資料
- android 感測器Android
- 感測器噪聲
- 工業資料通訊
- 10. 資料通訊
- Spark讀取MySQL資料SparkMySql
- 讀取JSON資料JSON
- PHPExcel讀取excel資料PHPExcel
- 利用反射讀取資料庫資料反射資料庫
- sqlserver讀取oracle資料庫資料SQLServerOracle資料庫