91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

  • 大小: 20KB
    文件類型: .cpp
    金幣: 1
    下載: 0 次
    發布日期: 2021-06-07
  • 語言: C/C++
  • 標簽: CRC??

資源簡介

16位 CRC 校驗代碼 直接可用

資源截圖

代碼片段和文件信息

/*
?*?8136S?freeRTOS?spi?slave?驅動
?*?除了CLK?CS?MISO?MOSI?4根線外,又增加了SPI?NOTIFY?和?SPI?READY?2根?GPIO,用于slave端通知master
?*?SPI?NOTIFY?GPIO?上升沿用于slave端通知master端有數據要發送,下降沿用于通知master端發送數據已就緒,master可以啟動SPI讀取數據
?*?SPI?READY??上升沿用于slave端通知master端?可以接收數據,
?*?數據包格式:應用數據長度(4個字節)?+?應用數據(n個字節)?,應用數據大小不能超過SPI_S_MAX_APP_SIZE
?*?master?->?slave?:?master?判斷?spi?ready?是否有效?(用信號量記錄)有效則發送4個字節長度信息,無效則等待有效;然后等spi?ready?信號量有效,再發送n個字節應用數據
?*? slave?收到?4個字節數據長度信息后,配置接收DMA,然后通過spi?ready給master一個中斷,DMA傳輸結束后配置接收DMA接收4個字節長度信息,然后通過spi?ready再給master一個中斷。
?*
?*? slave?->?master?:?slave?通過?SPI?NOTIFY?管腳給master一個下降沿中斷通知master端有數據發送,master端收到通知后給slave發送一個長度為0的4個字節長度信息,
?* slave收到長度為0的4個字節長度信息后知道master已準備好接收數據,slave配置發送DMA,就緒后通過?SPI?NOTIFY?管腳給master一個上升沿中斷通知master端可以讀取數據,
?* master收到SPI?READY?上升沿中斷后先讀取4個字節長度信息,然后讀取該長度的應用數據,slave?dma傳輸結束后?配置接收DMA?接收4個字節長度信息,下一次傳輸就緒,然后通過
?* SPI?READY?GPIO給master一個中斷。
?*
?* 該方式的SPI 工作在半雙工模式,也就是在同一時間,要么是master發送數據,要么是master接收數據,master通過數據長度信息發起讀寫操作。
?*?*/
#include?
#include?
#include?
#include?
#include?
#include?
#include?“lib_board.h“
#include?“lib_ssp.h“
#include?“lib_gpio.h“
#include?“platform_io.h“
#include?“io.h“
#include?“lib_pmu.h“
#include?“lib_dma.h“
#include?“lib_mm.h“
#include?“spi_slave.h“


#define?SPI_CRC16???????1


#define?SSP_DMA_TX_CH?????????AHB_DMA_Ch3
#define?SSP_DMA_RX_CH?????????AHB_DMA_Ch7
#define?SSP_base(x)???????????(0x91300000?+?0x100000?*?x)

static?xQueueHandle?tx_requst;
static?xQueueHandle?tx_done;
static?xQueueHandle?rx_done;

static?xQueueHandle?dma_rx;

static?u32?*spi_tx_rx_buf;
static?u32?spi_dma_rx_status;



#define?_GPIO_ID_(group?pin) ??((32?*?group)?+?pin)
#define?SPI_NOTIFY _GPIO_ID_(1?20)
#define?SPI_READY ???????_GPIO_ID_(1?19)

//demo
//#define?SPI_NOTIFY _GPIO_ID_(1?22)
//#define?SPI_READY ???????_GPIO_ID_(1?21)


#define?SPI_DMA_RX_STATUS_LEN???????0
#define?SPI_DMA_RX_STATUS_DATA??????1
#define?SPI_DMA_RX_STATUS_NULL??????2





//SPI數據包格式:?4個字節長度信息?+?n個字節應用數據
struct?spi_package_t
{
u32?len;
u32?len_crc;
u32?data[0];
};

#define?SPI_PACK_HEAD_SIZE???sizeof(struct?spi_package_t)

static?int?spi_dma_rx(void?*data?u32?len);

#if?SPI_CRC16
static?unsigned?int?crc_cal_by_byte(unsigned?char*?ptr?int?len);
#endif

inline?void?spi_slave_ready_rx()
{
u32?i;
gm_gpio_direction_output(SPI_READY?1);
for?(i?=?0;?i? asm(“nop“);
gm_gpio_direction_output(SPI_READY?0);
}

inline?void?spi_slave_request_tx()
{
gm_gpio_direction_output(SPI_NOTIFY?1);
}

inline?void?spi_slave_ready_tx()
{
gm_gpio_direction_output(SPI_NOTIFY?0);
}

static?void?ssp_tx_isr_cb(void?*data)
{
???gm_dma_clear_channel_int_status(SSP_DMA_TX_CH);
}

static?void?ssp_rx_isr_cb(void?*data)
{
//struct?spi_package_t?*pack;
u32?i;
//pack?=?(struct?spi_package_t?*)spi_tx_rx_buf;
gm_dma_clear_channel_int_status(SSP_DMA_RX_CH);
if(xQueueSendToBackFromISR(dma_rx?&i?NULL)?!=?pdPASS)
printf(“dma?rx?is?full!!!\n“);
// printf(“ssp_rx_isr_cb!!!\n

評論

共有 條評論