zoukankan      html  css  js  c++  java
  • MT2625 SPI学习

    https://blog.csdn.net/qq_38410730/article/details/80318821

    https://zhuanlan.zhihu.com/p/37506796

    https://wenku.baidu.com/view/cf7de1dcfd0a79563d1e7220.html


    DMA
    Direct Memory Access. DMA is a feature of computer systems that allows certain hardware subsystems to access main system memory independent from the central processing unit (CPU).

    FIFO First In, First Out. FIFO is a method for organizing and manipulating a data buffer, where the first entry, or 'head' of the queue, is processed first.

    GPIO General Purpose Inputs-Outputs.

    NVIC Nested Vectored Interrupt Controller. NVIC is the interrupt controller of ARM Cortex-M series processors.

    IRQ Interrupt Request. For more information

    MISO Master Input, Slave Output. Output from the SPI slave.

    MOSI Master Output, Slave Input. Output from the SPI master.

    SCLK Serial Clock. Output from the SPI master.

    SS Slave Select. Output from the SPI master, active low.

    SPI 串行外设接口是一种高速的,全双工,同步的通信总线

    Serial Peripheral Interface. The Serial Peripheral Interface bus is a synchronous serial communication interface specification used for short distance communication.

    mt2625 的 spi 有polling 、dma 、dma blocking模式,其中dma在初始化完成后需要注册回调函数,sample code如下:

      1 // Callback function sample code. Pass this function to the driver while calling #hal_spi_master_register_callback().
      2 void user_spi_callback (hal_spi_master_callback_event_t event,void *user_data)
      3 {
      4     rin_log("
     user_spi_callback event=%d 
    ",event);
      5     
      6     if (HAL_SPI_MASTER_EVENT_SEND_FINISHED == event)
      7     {
      8         // Send finish event handler;
      9         // User code;
     10         hal_spi_master_deinit(MASTER_SPI_PORT); // Deinitialize, if no longer in use.
     11     }
     12     else if (HAL_SPI_MASTER_EVENT_RECEIVE_FINISHED == event)
     13     {
     14         // Receive finish event handler;
     15         // User code;
     16         hal_spi_master_deinit(MASTER_SPI_PORT); // Deinitialize, if no longer in use.
     17     }
     18 }
     19 
     20 
     21 void SPIInitMasterDMAMode(void)
     22 {
     23     hal_spi_master_config_t spi_config_master;
     24     hal_spi_master_send_and_receive_config_t spi_send_and_receive_config;
     25     uint8_t status_cmd = 0x10;//SPIS_STATUS_CMD;
     26     
     27     hal_spi_master_status_t err = HAL_SPI_MASTER_STATUS_OK;
     28     
     29      // SPI init
     30     //hal_spi_master_send_and_receive_config_t spi_send_and_receive_config;
     31     uint8_t status_receive[2];
     32     uint8_t data[2] = {0x7E, 0x55};
     33     uint32_t size = 2;
     34 
     35     rin_log("
    SPIInitMasterMode 
    ");
     36     
     37     spi_config_master.bit_order = HAL_SPI_MASTER_LSB_FIRST;
     38     spi_config_master.slave_port = HAL_SPI_MASTER_SLAVE_0;
     39     spi_config_master.clock_frequency = 1000000;
     40     spi_config_master.phase = HAL_SPI_MASTER_CLOCK_PHASE0;
     41     spi_config_master.polarity = HAL_SPI_MASTER_CLOCK_POLARITY0;
     42     status_receive[1] = 0;
     43 
     44     spi_send_and_receive_config.receive_length = 2;
     45     spi_send_and_receive_config.send_length = 1;
     46     spi_send_and_receive_config.send_data = &status_cmd;
     47     spi_send_and_receive_config.receive_buffer = status_receive;
     48 
     49     // Step 1. Call hal_gpio_init() to inite the pins,
     50     // if EPT tool hasn't been used to configure the related pinmux.
     51     hal_gpio_init(SPI_CS);
     52     hal_gpio_init(SPI_CLK);
     53     hal_gpio_init(SPI_MOSI);
     54     hal_gpio_init(SPI_MISO);
     55     
     56     // Step 2. Call hal_pinmux_set_function() to set GPIO pinmux,
     57     // if EPT tool hasn't been used to configure the related pinmux.
     58     hal_pinmux_set_function(SPI_CS, HAL_GPIO_19_SPI_MST1_CS);// Set the pin to be used as CS signal of SPI.
     59     hal_pinmux_set_function(SPI_CLK, HAL_GPIO_22_SPI_MST1_SCK);// Set the pin to be used as SCK signal of SPI.
     60     hal_pinmux_set_function(SPI_MISO, HAL_GPIO_20_SPI_MST1_MISO);// Set the pin to be used as MOSI signal of SPI.
     61     hal_pinmux_set_function(SPI_MOSI, HAL_GPIO_21_SPI_MST1_MOSI);// Set the pin to be used as MISO signal of SPI.
     62 
     63     // Step 3. Call hal_spi_master_init() to initialize one SPI master.
     64     // If the SPI master is already initialized by another user, user will get HAL_SPI_MASTER_STATUS_ERROR_BUSY.
     65     err = hal_spi_master_init(MASTER_SPI_PORT,&spi_config_master);
     66     
     67     if (HAL_SPI_MASTER_STATUS_OK == err)
     68     {
     69         rin_log("
    HAL_SPI_MASTER_STATUS_OK 
    ");
     70 
     71         // Step 4. Call hal_spi_master_register_callback() to register a user callback.
     72         err = hal_spi_master_register_callback(MASTER_SPI_PORT, (hal_spi_master_callback_t)user_spi_callback, NULL);
     73         
     74         if (HAL_SPI_MASTER_STATUS_OK != err)
     75         {
     76             // Error handler;
     77             rin_log("
     reg cb fail err=%d 
    ",err);
     78         }
     79         rin_log("
     reg cb HAL_SPI_MASTER_STATUS_OK 
    ");
     80         
     81         TaskDelay(24);
     82         
     83         // Step 5. Call hal_spi_master_send_dma() to send data in the DMA mode.
     84         // Step 6. Call hal_spi_master_send_and_receive_dma() to send and receive data in the DMA mode.
     85         err = hal_spi_master_send_dma(MASTER_SPI_PORT,data,size);//Half-duplex
     86 
     87         TaskDelay(1000);
     88 
     89         // Call hal_spi_master_send_and_receive_dma() to send and receive data in the DMA mode.
     90         //if (HAL_SPI_MASTER_STATUS_OK != hal_spi_master_send_and_receive_dma(MASTER_SPI_PORT,&spi_send_and_receive_config))
     91         //{
     92             // Error handler;
     93             //rin_log("
     send and recv fail err=%d 
    ",err);
     94         //}
     95     
     96         if (HAL_SPI_MASTER_STATUS_OK != err)
     97         {
     98             // Error handler;
     99             rin_log("
     send fail err=%d 
    ",err);
    100         }
    101         else
    102         {
    103             rin_log("
     send suc data=0x%x 0x%x 
    ",data[0],data[1]);
    104         }
    105     }
    106     else
    107     {    
    108         // Error handler;
    109         rin_log("
     init fail err=%d 
    ",err);
    110     }
    111 
    112     // Step 6. Call hal_spi_master_deinit() to deinitialize the SPI master, if it's no longer in use.
    113     //err = hal_spi_master_deinit();//deinit in cb func
    114     rin_log("
     hal_spi_master_deinit err=%d 
    ",err);
    115     //vTaskDelete(g_HLSpi_task_handle);
    116     
    117 }
  • 相关阅读:
    2019 ICPC Asia Nanchang Regional E Eating Plan 离散化+前缀和
    2018icpc南京/gym101981 G Pyramid 找规律
    2018icpc沈阳/gym101955 J How Much Memory Your Code Is Using? 签到
    2018icpc南京/gym101981 K Kangaroo Puzzle 随机化
    series_02
    series_01
    locust_参数化关联
    locust_关联
    locust_单接口
    截图处理
  • 原文地址:https://www.cnblogs.com/levinkai/p/11579064.html
Copyright © 2011-2022 走看看