首頁 > 評測 > 【LKS32AT085評測】2.電動自行車一線通應(yīng)用之SIF
【LKS32AT085評測】2.電動自行車一線通應(yīng)用之SIF
- [導(dǎo)讀]
- 本帖最后由 yang377156216 于 2022-9-19 15:47 編輯 #申請原創(chuàng)# @21小跑堂 前言前面說到可以通過某個專業(yè)領(lǐng)域應(yīng)用去打開市場,這里想推薦一個領(lǐng)域:兩輪電動自行車。這個東西相信大家都非常熟悉,幾乎每天都
本帖最后由 yang377156216 于 2022-9-19 15:47 編輯
#申請原創(chuàng)# @21小跑堂
前言

兩輪電動車行業(yè)情況


電動自行車通信協(xié)議團(tuán)體標(biāo)準(zhǔn)

一線通 SIF 協(xié)議

-
一線通 SIF 協(xié)議比較簡單,實現(xiàn)起來成本較低,適用于一些數(shù)據(jù)量不大且通訊品質(zhì)要求不那么高的場景;
-
屬于單線主從單工通訊模式,類似 1-Wire 協(xié)議但又與之有很大不同,為單工通訊的,即設(shè)備要么僅作為發(fā)送端,要么僅作為接收方,比如上面框圖中 BMS 為發(fā)送發(fā)(主機),控制器和充電器僅為接收方(從機);
-
波特率要么像 UART 一樣提前固定好,要么讓接收端自動適應(yīng)發(fā)送方的同步信號從而來解析出匹配到的波特率;
-
一次傳輸一幀數(shù)據(jù),每幀數(shù)據(jù)由 同步信號(發(fā)送主報文的前導(dǎo)信號) + 數(shù)據(jù)信號(8bit * 12個數(shù)據(jù)位的有效數(shù)據(jù)內(nèi)容,按一定占空比進(jìn)行發(fā)送)+ 結(jié)束信號(一幀完整的數(shù)據(jù)發(fā)送結(jié)束的標(biāo)志信號) 3個部分組成,傳輸結(jié)束后要求線路空閑狀態(tài)為低電平,每次傳輸需一次性完整傳輸所有數(shù)據(jù);
-
數(shù)據(jù)的電平遵守 TTL 規(guī)范。
一般一線通接口原理設(shè)計如下,IN 為主機單片機的輸出口,OUT 為總線接口:


-
32Tosc 范圍為 0.5ms,考慮到響應(yīng)速度,不要超過1ms
-
同步信號:>992Tosc 的低電平 + 32Tosc 的高電平,空閑位時間>15ms(0.5ms*992/32=15ms)
-
數(shù)據(jù)位邏輯 1 符合 高電平時間 > 低電平時間 + 0.5ms;
-
數(shù)據(jù)位邏輯 0 符合 低電平時間 > 高電平時間 + 0.5ms;
-
高低電平的比例一般使用 0.5ms 和 1ms 的比例,及占空比為 1:2 (適宜取 75%)
凌鷗 SIF 接口驅(qū)動代碼
- #define SIF_VERSION 1
- #define SIF_SYNC 53
- #define SIF_SEND_COUNT 3
- volatile static uint8_t sif_sync_tosc = 0;
- volatile static uint8_t sif_send_tosc = 0;
- volatile static uint8_t state_mode = 0;
- volatile static int8_t bit_cnt = 7;
- volatile static uint8_t byte_cnt = 0;
- static uint8_t result[64] = {0};//需要發(fā)送的數(shù)據(jù)
- volatile static uint8_t length = 0;//數(shù)據(jù)的長度
- static void sif_send_data_handle(uint8_t state)
- {
- switch(state)
- {
- case SYNC_SIGNAL://同步模式
- if (sif_sync_tosc < SIF_SYNC - 2) {
- sif_turn_off();
- } else {
- sif_turn_on();
- }
- sif_sync_tosc++;
- if (sif_sync_tosc >= SIF_SYNC)
- {
- state_mode = SEND_DATA;
- sif_sync_tosc = 0;
- bit_cnt = 7;
- byte_cnt = 0;
- sif_send_tosc = 0;
- }
- break;
- case SEND_DATA: //發(fā)送數(shù)據(jù)
- static uint8_t res;
- uint8_t count = SIF_SEND_COUNT;
- static uint8_t nums = sizeof(uint8_t) * 8;
- uint8_t *p = (uint8_t *)result;
- sif_send_tosc = sif_send_tosc % count;
- uint8_t data = (p[byte_cnt] >> bit_cnt) & 0x1;
- if (data)
- {
- if (sif_send_tosc == 0)
- {
- sif_turn_off();
- sif_send_tosc ++;
- }
- else if (sif_send_tosc == 1)
- {
- sif_turn_on();
- sif_send_tosc ++;
- } else {
- sif_send_tosc = 0;
- }
- }
- else
- {
- if (sif_send_tosc == 0)
- {
- sif_turn_off();
- sif_send_tosc++;
- }
- else if (sif_send_tosc == 2)
- {
- sif_turn_on();
- sif_send_tosc = 0;
- } else
- {
- sif_send_tosc++;
- }
- }
- if (sif_send_tosc == 0)
- {
- if (--bit_cnt < 0)
- {
- byte_cnt++;
- bit_cnt = 7;
- }
- if (byte_cnt >= length)
- {
- state_mode = SEND_DATA_COMPLETE;
- break;
- }
- }
- break;
- case SEND_DATA_COMPLETE://數(shù)據(jù)發(fā)送完成,將標(biāo)志位清0
- state_mode = 0;
- sif_turn_off();
- length = 0;
- memset(result, 0, sizeof(result));
- break;
- default:
- break;
- }
- }
- /*******************************************************************************
- * 版權(quán)所有 (C)2015, LINKO SEMICONDUCTOR Co.ltd
- *
- * 文件名稱: lks32at08x_sif.c
- * 文件標(biāo)識:
- * 內(nèi)容摘要: SIF 外設(shè)驅(qū)動程序
- * 其它說明: 無
- * 當(dāng)前版本: V 1.0
- * 作 者: yang377156216
- * 完成日期:
- *
- * 修改記錄1:
- * 修改日期:
- * 版 本 號:V 1.0
- * 修 改 人:
- * 修改內(nèi)容:創(chuàng)建
- *
- ******************************************************************************/
- #include "lks32at08x_sif.h"
- /*******************************************************************************
- 函數(shù)名稱: void SIF_Init(SIF_TypeDef *SIFx, SIF_InitTypeDef *SIF_InitStruct)
- 功能描述: SIF 初始化
- 操作的表: 無
- 輸入?yún)?shù): SIF_TypeDef *SIFx, SIF_InitTypeDef *SIF_InitStruct
- 輸出參數(shù): 無
- 返 回 值: 無
- 其它說明:
- 修改日期 版本號 修改人 修改內(nèi)容
- -------------------------------------------------------------------------------
- 2022/08/19 V1.0 yang377156216 創(chuàng)建
- ******************************************************************************/
- void SIF_Init(SIF_TypeDef *SIFx, SIF_InitTypeDef *SIF_InitStruct)
- {
- if (SIFx == SIF0)
- {
- //開啟 SIF 的時鐘,這里默認(rèn)就是開啟的;
- }
- SIFx ->CFG &= ~(0x01 << 1);
- SIFx ->CFG |= (SIF_InitStruct->Endian << 1);
- SIFx ->FREQ &= ~(0x0F << 4);
- SIFx ->FREQ |= (SIF_InitStruct->Tosc << 4);
- SIFx ->FREQ &= ~(0x01 << 0);
- SIFx ->FREQ |= (SIF_InitStruct->Duty << 0);
- SIFx ->IRQ &= ~(0x01 << 0);
- SIFx ->IRQ |= (SIF_InitStruct->TxIE << 0);
- }
- /*******************************************************************************
- 函數(shù)名稱: void SIF_DeInit(SIF_TypeDef *SIFx)
- 功能描述: SIF 反初始化
- 操作的表: 無
- 輸入?yún)?shù): SIF_TypeDef *SIFx
- 輸出參數(shù): 無
- 返 回 值: 無
- 其它說明:
- 修改日期 版本號 修改人 修改內(nèi)容
- -------------------------------------------------------------------------------
- 2022/08/19 V1.0 yang377156216 創(chuàng)建
- ******************************************************************************/
- void SIF_DeInit(SIF_TypeDef *SIFx)
- {
- SIFx ->CFG = 1;
- SIFx ->FREQ = 0;
- SIFx ->IRQ = 0;
- SIFx ->WDATA = 0;
- SIFx ->CFG = 0;
- }
- /*******************************************************************************
- 函數(shù)名稱: void SIF_StructInit(SIF_InitTypeDef *SIF_InitStruct)
- 功能描述: SIF 結(jié)構(gòu)體初始化
- 操作的表: 無
- 輸入?yún)?shù): SIF_InitTypeDef *SIF_InitStruct
- 輸出參數(shù): 無
- 返 回 值: 無
- 其它說明:
- 修改日期 版本號 修改人 修改內(nèi)容
- -------------------------------------------------------------------------------
- 2022/08/19 V1.0 yang377156216 創(chuàng)建
- ******************************************************************************/
- void SIF_StructInit(SIF_InitTypeDef *SIF_InitStruct)
- {
- SIF_InitStruct->Duty = SIF_DUTY_2_1;
- SIF_InitStruct->Endian = SIF_ENDIAN_LSB;
- SIF_InitStruct->Tosc = SIF_Tosc_32US_Default;
- SIF_InitStruct->TxIE = SIF_TX_IE_DIS;
- }
- /*******************************************************************************
- 函數(shù)名稱: void SIF_MouduleEnable(SIF_TypeDef *SIFx, uint8_t enable)
- 功能描述: SIF 模塊使能/關(guān)閉
- 操作的表: 無
- 輸入?yún)?shù): SIF_TypeDef *SIFx, uint8_t enable
- 輸出參數(shù): 無
- 返 回 值: 無
- 其它說明:
- 修改日期 版本號 修改人 修改內(nèi)容
- -------------------------------------------------------------------------------
- 2022/08/19 V1.0 yang377156216 創(chuàng)建
- ******************************************************************************/
- void SIF_MouduleEnable(SIF_TypeDef *SIFx, uint8_t enable)
- {
- if(enable == ENABLE)
- {
- SIFx ->CFG |= SIF_MODULE_EN;
- }
- else
- {
- SIFx ->CFG &= ~SIF_MODULE_EN;
- }
- }
- /*******************************************************************************
- 函數(shù)名稱: void SIF_LastByte_Set(SIF_TypeDef *SIFx, uint8_t enable)
- 功能描述: SIF 結(jié)束本次傳輸
- 操作的表: 無
- 輸入?yún)?shù): SIF_TypeDef *SIFx, uint8_t enable
- 輸出參數(shù): 無
- 返 回 值: 無
- 其它說明:
- 修改日期 版本號 修改人 修改內(nèi)容
- -------------------------------------------------------------------------------
- 2022/08/19 V1.0 yang377156216 創(chuàng)建
- ******************************************************************************/
- void SIF_LastByte_Set(SIF_TypeDef *SIFx, uint8_t enable)
- {
- if(enable == ENABLE)
- {
- SIFx ->CFG |= SIF_LAST_BYTE_EN;
- }
- }
- /*******************************************************************************
- 函數(shù)名稱: void SIF_SendData(SIF_TypeDef *SIFx, uint8_t data)
- 功能描述: SIF 發(fā)送數(shù)據(jù)
- 操作的表: 無
- 輸入?yún)?shù): SIF_TypeDef *SIFx, uint8_t data
- 輸出參數(shù): 無
- 返 回 值: 無
- 其它說明:
- 修改日期 版本號 修改人 修改內(nèi)容
- -------------------------------------------------------------------------------
- 2022/08/19 V1.0 yang377156216 創(chuàng)建
- ******************************************************************************/
- void SIF_SendData(SIF_TypeDef *SIFx, uint8_t data)
- {
- SIFx->WDATA = data;
- }
- /*******************************************************************************
- 函數(shù)名稱: uint32_t SIF_GetIRQFlag(SIF_TypeDef *SIFx, uint32_t tempFlag)
- 功能描述: 取得 SIF 中斷標(biāo)志
- 操作的表: 無
- 輸入?yún)?shù): SIF_TypeDef *SIFx, uint32_t tempFlag
- 輸出參數(shù): 無
- 返 回 值: SIF 中斷標(biāo)志
- 其它說明:
- 修改日期 版本號 修改人 修改內(nèi)容
- -------------------------------------------------------------------------------
- 2022/08/19 V1.0 yang377156216 創(chuàng)建
- ******************************************************************************/
- uint32_t SIF_GetIRQFlag(SIF_TypeDef *SIFx, uint32_t tempFlag)
- {
- if (((SIFx->IRQ & tempFlag) != Bit_RESET) && \
- (SIFx->IRQ & SIF_TX_IE_EN) != Bit_RESET)
- {
- return 1;
- }
- return 0;
- }
- /*******************************************************************************
- 函數(shù)名稱: void SIF_ClearIRQFlag(SIF_TypeDef *SIFx, uint32_t tempFlag)
- 功能描述: 清除 SIF 中斷標(biāo)志位
- 操作的表: 無
- 輸入?yún)?shù): SIF_TypeDef *SIFx, uint32_t tempFlag
- 輸出參數(shù): 無
- 返 回 值: 無
- 其它說明:
- 修改日期 版本號 修改人 修改內(nèi)容
- -------------------------------------------------------------------------------
- 2022/08/19 V1.0 yang377156216 創(chuàng)建
- ******************************************************************************/
- void SIF_ClearIRQFlag(SIF_TypeDef *SIFx, uint32_t tempFlag)
- {
- SIFx->IRQ |= tempFlag;
- }
- /*********************** (C) COPYRIGHT LINKO SEMICONDUCTOR *****END OF FILE****/
- /*******************************************************************************
- * 版權(quán)所有 (C)2015, LINKO SEMICONDUCTOR Co.ltd
- *
- * 文件名稱: lks32at08x_sif.h
- * 文件標(biāo)識:
- * 內(nèi)容摘要: SIF 驅(qū)動頭文件
- * 其它說明: 無
- * 當(dāng)前版本: V 1.0
- * 作 者: yang377156216
- * 完成日期:
- *
- * 修改記錄1:
- * 修改日期:
- * 版 本 號:V 1.0
- * 修 改 人:
- * 修改內(nèi)容:創(chuàng)建
- *
- ******************************************************************************/
- #ifndef __LKS32AT08x_SIF_H
- #define __LKS32AT08x_SIF_H
- /* Includes ------------------------------------------------------------------*/
- #include "lks32mc08x_lib.h"
- typedef struct
- {
- __IO uint32_t CFG;
- __IO uint32_t FREQ;
- __IO uint32_t IRQ;
- __IO uint32_t WDATA;
- } SIF_TypeDef;
- typedef enum
- {
- SIF_Tosc_32US_Default = 0x00,
- SIF_Tosc_32US = 0x01,
- SIF_Tosc_64US = 0x02,
- SIF_Tosc_96US = 0x03,
- SIF_Tosc_128US = 0x04,
- SIF_Tosc_160US = 0x05,
- SIF_Tosc_192US = 0x06,
- SIF_Tosc_220US = 0x07,
- SIF_Tosc_256US = 0x08,
- SIF_Tosc_288US = 0x09,
- SIF_Tosc_320US = 0x0A,
- } SIF_ToscSet;
- typedef struct
- {
- uint8_t Endian; /*SIF 大小端,1 = MSB , 0 = LSB 默認(rèn)*/
- uint8_t Tosc; /*96Mhz 系統(tǒng)時鐘下,基準(zhǔn)時間單位 Tosc 設(shè)置*/
- uint8_t Duty; /*SIF 傳輸 Data 占空比*/
- uint8_t TxIE; /*發(fā)送中斷使能*/
- } SIF_InitTypeDef;
- #ifndef SIF0
- #define SIF0 ((SIF_TypeDef *) SIF_BASE)
- #endif
- #ifndef SIF_MCU_MCLK
- #define SIF_MCU_MCLK (96000000LL) /* 系統(tǒng)時鐘 */
- #endif
- #define SIF_LAST_BYTE_EN (1 << 4) /*是否結(jié)束本次傳輸*/
- #define SIF_ENDIAN_LSB 0 /*低端先發(fā)送*/
- #define SIF_ENDIAN_MSB 1 /*高端先發(fā)送*/
- #define SIF_MODULE_EN (1 << 0) /*SIF 模塊使能*/
- #define SIF_DUTY_2_1 0 /*占空比為 2:1*/
- #define SIF_DUTY_3_1 1 /*占空比為 3:1*/
- #define SIF_TX_IE_DIS 0 /*SIF 中斷禁止*/
- #define SIF_TX_IE_EN 1 /*SIF 中斷使能*/
- /*中斷標(biāo)志定義*/
- #define SIF_TX_IFLAG (1 << 4) /*發(fā)送完成中斷*/
- void SIF_MouduleEnable(SIF_TypeDef *SIFx, uint8_t enable);
- void SIF_LastByte_Set(SIF_TypeDef *SIFx, uint8_t enable);
- void SIF_DeInit(SIF_TypeDef *SIFx);
- void SIF_Init(SIF_TypeDef *SIFx, SIF_InitTypeDef *SIF_InitStruct);
- void SIF_StructInit(SIF_InitTypeDef *SIF_InitStruct);
- void SIF_SendData(SIF_TypeDef *SIFx, uint8_t data);
- uint32_t SIF_GetIRQFlag(SIF_TypeDef *SIFx, uint32_t tempFlag);
- void SIF_ClearIRQFlag(SIF_TypeDef *SIFx, uint32_t tempFlag);
- #endif /*__lks32mc08x_SIF_H */
- /************************ (C) COPYRIGHT LINKO SEMICONDUCTOR *****END OF FILE****/




- /*******************************************************************************
- *@時 間 : 2022-2-22
- *@摘 要 : 主程序文件
- *@芯 片 :
- *
- *******************************************************************************/
- /*================================= Demo說明 ===================================
- 定時器 + 一個GPIO口進(jìn)行通訊數(shù)據(jù)讀取
- ==============================================================================*/
- /* 包含的頭文件 ---------------------------------------------------------------*/
- //與實際單片機相關(guān)
- /* 宏定義 ---------------------------------------------------------------------*/
- #define DATA_REV_PIN gpio_input_bit_get(GPIOB,BIT(9)) //定義數(shù)據(jù)接收引腳(根據(jù)實際項目進(jìn)行更改)
- #define LOW 0 //低電平
- #define HIGH 1 //高電平
- #define SYNC_L_TIME_NUM 1100 //同步信號低電平時間:50ms = 50000us / 50us = 1000
- #define SYNC_H_TIME_NUM_MIN 8 //同步信號高電平最小時間:500-100us = 400us / 50us = 8
- #define SYNC_H_TIME_NUM_MAX 12 //同步信號高電平最大時間:500+100us = 600us / 50us = 12
- #define SHORT_TIME_NUM_MIN 9 //一個邏輯周期中短的時間最小值:500-50us = 450us / 50us = 9
- #define SHORT_TIME_NUM_MAX 11 //一個邏輯周期中短的時間最大值:500+50us = 550us / 50us = 11
- #define LONG_TIME_NUM_MIN 18 //一個邏輯周期中長的時間最小值:1ms-100us = 900us / 50us = 18
- #define LONG_TIME_NUM_MAX 22 //一個邏輯周期中長的時間最大值:1ms+100us = 1100us / 50us = 22
- #define LOGIC_CYCLE_NUM_MIN 26 //一個邏輯周期最小時間:1.5ms-200us = 1300us / 50us = 26
- #define LOGIC_CYCLE_NUM_MAX 34 //一個邏輯周期最大時間:1.5ms+200us = 1700us / 50us = 34
- #define HALF_LOGIC_CYCLE_MIN 13 //一個邏輯周期的1/2最小時間:750-100us = 650us / 50us = 13
- #define HALF_LOGIC_CYCLE_MAX 17 //一個邏輯周期的1/2最大時間:750+100us = 850us / 50us = 17
- #define END_SIGNAL_TIME_NUM 100 //結(jié)束信號電平時間:5ms低電平 + Nms高電平,實際檢測5ms低電平就行,一幀數(shù)據(jù)發(fā)送完成后檢測5ms低電平就代表完成了,不發(fā)數(shù)據(jù)的時候上拉電阻拉高了
- #define REV_BIT_NUM 8 //接收的bit位個數(shù),看是按字節(jié)接收還是按字接收,1字節(jié)=8bit,1字=2字節(jié)=16bit
- #define REV_DATA_NUM 12 //接收的數(shù)據(jù)個數(shù)
- /* 類型定義 -------------------------------------------------------------------*/
- typedef enum
- {
- INITIAL_STATE=0, //初始狀態(tài),等待接收同步信號
- SYNC_L_STATE=1, //接收同步低電平信號狀態(tài)
- SYNC_H_STATE=2, //接收同步高電平信號狀態(tài)
- DATA_REV_STATE=3, //讀取數(shù)據(jù)碼電平狀態(tài)
- END_SIGNAL_STATE=4, //接收結(jié)束電平信號狀態(tài)
- RESTART_REV_STATE=5 //接收過程出錯重新接收狀態(tài)
- }REV_STATE_e; //接收數(shù)據(jù)狀態(tài)枚舉
- /* 變量定義 -------------------------------------------------------------------*/
- unsigned char receive_state=0; //接收數(shù)據(jù)狀態(tài)
- unsigned char receive_bit_num=0; //接收的bit位個數(shù)
- unsigned char receive_data_num=0; //接收的數(shù)據(jù)個數(shù)
- //接收數(shù)據(jù)緩存數(shù)組-用一個數(shù)組來緩存數(shù)據(jù),51個數(shù)據(jù)字節(jié)
- unsigned char receive_data_buf[REV_DATA_NUM]={0};
- unsigned char receive_data[REV_DATA_NUM] = {0};
- unsigned int H_L_Level_time_cnt=0; //高低電平時間計數(shù)
- uint8_t start_H_L_Level_timming_flag=0; //開始高低電平計時標(biāo)記
- uint8_t has_read_bit = 0; //1-已經(jīng)讀取一個bit位
- uint8_t check_OK = 0; //1-校驗和正確,0-校驗和失敗
- uint8_t read_success=0; //一幀數(shù)據(jù)是否讀取成功,0-不成功,1-成功
- uint8_t Pin_Old = 0;
- uint8_t Pin_New = 0;
- uint8_t Pin_Change_Flag = 0;
- uint8_t BitFinish_Flag = 0;
- /* 函數(shù)聲明 -------------------------------------------------------------------*/
- void GPIO_Init(void); //GPIO初始化函數(shù)
- void Timer1_Init(void); //定時器1初始化函數(shù)
- void Receive_Data_Handle(void); //接收數(shù)據(jù)處理
- void Check_Sum_Handle(void); //校驗和處理
- /* 函數(shù)定義 -------------------------------------------------------------------*/
- /*******************************************************************************
- *函數(shù)名稱 : SIF_Handle
- *函數(shù)功能 : SIF 解析函數(shù),在主循環(huán)中調(diào)用
- *輸入?yún)?shù) : void
- *輸出返回 : void
- *******************************************************************************/
- void main(void)
- {
- GPIO_Init(); //GPIO初始化,設(shè)置數(shù)據(jù)接收引腳P10為浮空輸入,檢測高低電平
- Timer1_Init(); //定時器1初始化,定時周期為:5微秒
- while(1)
- {
- SIF_Handle();
- }
- }
- /*******************************************************************************
- *函數(shù)名稱 : SIF_Handle
- *函數(shù)功能 : SIF 解析函數(shù),在主循環(huán)中調(diào)用
- *輸入?yún)?shù) : void
- *輸出返回 : void
- *******************************************************************************/
- void SIF_Handle(void)
- {
- if (read_success == 1) //如果成功讀取一幀數(shù)據(jù)
- {
- //一幀數(shù)據(jù)接收成功后先根據(jù)協(xié)議要求進(jìn)行校驗和,驗證數(shù)據(jù)的正確性
- Check_Sum_Handle();
- //如果數(shù)據(jù)正確,根據(jù)接收的數(shù)據(jù)進(jìn)行分析獲取需要的內(nèi)容
- if (check_OK)
- {
- memcpy(receive_data, receive_data_buf, REV_DATA_NUM);
- }
- read_success = 0; //讀取一幀數(shù)據(jù)清0
- }
- }
- /*******************************************************************************
- *函數(shù)名稱 : Timer1_isr
- *函數(shù)功能 : 定時器1中斷處理函數(shù)
- *輸入?yún)?shù) : void
- *輸出返回 : void
- *******************************************************************************/
- void TIMER1_IRQHandler(void)
- {
- if(SET == timer_interrupt_flag_get(TIMER1, TIMER_INT_CH0))
- {
- /* clear channel 0 interrupt bit */
- timer_interrupt_flag_clear(TIMER1, TIMER_INT_CH0);
- Pin_New = DATA_REV_PIN;
- if (start_H_L_Level_timming_flag==1)
- {
- H_L_Level_time_cnt++; //高低電平維持時間計數(shù)變量
- Pin_Change_Flag = 0;
- BitFinish_Flag = 0;
- if(Pin_New != Pin_Old)
- {
- Pin_Change_Flag = 1;
- if(0 == Pin_New)
- {BitFinish_Flag = 1;}
- }
- Pin_Old = Pin_New;
- }
- Receive_Data_Handle(); //接收數(shù)據(jù)處理,波特率自適應(yīng)
- led_toggle(LED2);//測試用的 LED
- }
- }
- /*******************************************************************************
- *函數(shù)名稱 : Receive_Data_Handle
- *函數(shù)功能 : 接收數(shù)據(jù)處理
- *輸入?yún)?shù) : void
- *輸出返回 : void
- *******************************************************************************/
- void Receive_Data_Handle(void)
- {
- switch (receive_state) //檢測當(dāng)前接收數(shù)據(jù)狀態(tài)
- {
- case INITIAL_STATE: //初始狀態(tài),未接收到同步信息,進(jìn)行同步判斷
- if (DATA_REV_PIN == LOW) //判斷接收引腳的電平狀態(tài),當(dāng)讀到低電平時,開始計時
- {
- receive_bit_num = 0; //重置bit位計數(shù)器
- receive_data_num = 0; //重置接收數(shù)據(jù)個數(shù)
- H_L_Level_time_cnt = 0; //高低電平計時變量清0
- start_H_L_Level_timming_flag = 1; //開始高低電平計時
- receive_state = SYNC_L_STATE; //進(jìn)入讀取同步低電平信號狀態(tài)
- memset(receive_data_buf, 0 ,REV_DATA_NUM);
- }
- break;
- case SYNC_L_STATE: //在讀取同步低電平信號期間
- if (DATA_REV_PIN == HIGH) //同步信號低電平檢測期間讀到高電平
- {
- if (H_L_Level_time_cnt >= SYNC_L_TIME_NUM)//如果同步信號低電平時間>=SYNC_L_TIME_NUM
- { //同步信號低電平時間要>=10ms
- H_L_Level_time_cnt = 0; //高低電平計時變量清0
- receive_state = SYNC_H_STATE; //進(jìn)入讀取同步信號高電平狀態(tài)
- }
- else
- {
- receive_state = RESTART_REV_STATE; //進(jìn)入重新接收狀態(tài)
- }
- }
- break;
- case SYNC_H_STATE: //在讀取同步信號高電平期間
- if (DATA_REV_PIN == LOW) //同步信號高電平檢測期間讀到低電平
- {
- //判斷同步信號高電平時間是否在1ms±100us之間
- if (H_L_Level_time_cnt >= SYNC_H_TIME_NUM_MIN && H_L_Level_time_cnt <= SYNC_H_TIME_NUM_MAX)
- {
- H_L_Level_time_cnt = 0; //高低電平計時變量清0
- receive_state = DATA_REV_STATE; //進(jìn)入讀取數(shù)據(jù)狀態(tài)
- }
- else
- {
- receive_state = RESTART_REV_STATE; //進(jìn)入重新接收狀態(tài)
- }
- }
- else //如果在同步信號高電平檢測期間,時間超過2ms±200us,認(rèn)為超時
- {
- //判斷時間是否超時 2ms±200us
- if (H_L_Level_time_cnt >= LOGIC_CYCLE_NUM_MAX)
- {
- receive_state = RESTART_REV_STATE; //進(jìn)入重新接收狀態(tài)
- }
- }
- break;
- case DATA_REV_STATE: //在讀取數(shù)據(jù)碼電平期間
- if ((has_read_bit==0) && (H_L_Level_time_cnt >= HALF_LOGIC_CYCLE_MIN && H_L_Level_time_cnt <= HALF_LOGIC_CYCLE_MAX))
- {
- receive_data_buf[receive_data_num] |= DATA_REV_PIN;
- has_read_bit = 1;
- }
- //如果已經(jīng)讀取一個bit位,且時間計數(shù)已經(jīng)>=2ms±200us,說明一個邏輯周期過去了
- if ((has_read_bit==1) && (H_L_Level_time_cnt >= LOGIC_CYCLE_NUM_MIN && H_L_Level_time_cnt <= LOGIC_CYCLE_NUM_MAX))
- //if ((has_read_bit==1) && (1 == BitFinish_Flag))
- {
- H_L_Level_time_cnt = 0; //高低電平計時變量清0
- has_read_bit = 0; //清0,讀取下一個bit位
- receive_bit_num++; //接收的bit數(shù)++
- if (receive_bit_num == REV_BIT_NUM) //如果一個字節(jié)8個bit位接收完成
- {
- //receive_data[receive_data_num] = receive_data_buf[receive_data_num];
- receive_data_num++; //接收的數(shù)據(jù)個數(shù)++
- receive_bit_num = 0; //接收bit位個數(shù)清0重新接收
- if (receive_data_num == REV_DATA_NUM) //如果數(shù)據(jù)采集完畢
- {
- receive_state = END_SIGNAL_STATE; //進(jìn)入接收結(jié)束低電平信號狀態(tài)
- }
- }
- else //如果一個字節(jié)8個bit位還沒有接收完成
- {
- //將接收數(shù)據(jù)緩存左移一位,數(shù)據(jù)從低bit位開始接收
- receive_data_buf[receive_data_num] = receive_data_buf[receive_data_num] >> 1;
- }
- }
- break;
- case END_SIGNAL_STATE: //在接收結(jié)束信號低電平期間
- if (DATA_REV_PIN == LOW)
- {
- if (H_L_Level_time_cnt >= END_SIGNAL_TIME_NUM) //如果讀到低電平時間>=5ms
- {
- read_success = 1; //一幀數(shù)據(jù)讀取成功
- SIF_Handle();
- start_H_L_Level_timming_flag = 0; //停止高低電平計時
- H_L_Level_time_cnt = 0; //定時器計數(shù)值清0
- receive_state = INITIAL_STATE; //接收狀態(tài)清0
- }
- }
- else //結(jié)束信號低電平檢測期間一直為低
- {
- //if (H_L_Level_time_cnt >= SYNC_L_TIME_NUM) //如果讀到低電平時間>=10ms,認(rèn)為超時
- { //一幀數(shù)據(jù)發(fā)送完成后需要間隔50ms才發(fā)送第二幀數(shù)據(jù),期間肯定會被拉高
- receive_state = RESTART_REV_STATE; //進(jìn)入重新接收狀態(tài)
- }
- }
- break;
- case RESTART_REV_STATE: //重新接收數(shù)據(jù)狀態(tài)
- start_H_L_Level_timming_flag = 0; //停止高低電平計時
- H_L_Level_time_cnt = 0; //定時器計數(shù)值清0
- receive_state = INITIAL_STATE; //接收狀態(tài)清0
- break;
- }
- }
- /*******************************************************************************
- *函數(shù)名稱 : Check_Sum_Handle
- *函數(shù)功能 : 校驗和處理
- *輸入?yún)?shù) : void
- *輸出返回 : void
- *******************************************************************************/
- void Check_Sum_Handle(void)
- {
- unsigned char i = 0, checkByte = 0;
- unsigned long checkXor = 0;
- for ( i = 0; i < (REV_DATA_NUM ); i++)
- {
- checkXor = checkXor ^ receive_data_buf[i];
- }
- checkByte = (unsigned char)checkXor;
- if (checkByte == receive_data_buf[REV_DATA_NUM-1]) //校驗和正確
- {
- check_OK = 1; //標(biāo)記校驗成功
- }
- else
- {
- check_OK = 0; //標(biāo)記校驗失敗
- }
- }
- uint8_t * pGetSIFData(void)
- {
- return receive_data;
- }
儀表盤液晶屏幕一線通應(yīng)用

小結(jié)

1. 2022年中國兩輪電動車行業(yè)分析報告.zip (1.68 MB)
-
- 本文系21ic原創(chuàng),未經(jīng)許可禁止轉(zhuǎn)載!
網(wǎng)友評論
- 聯(lián)系人:巧克力娃娃
- 郵箱:board@21ic.com
- 我要投稿
-
歡迎入駐,開放投稿
-
人均百萬?英偉達(dá)中國員工收入曝光! 2024-08-29
-
《黑神話:悟空》玩家硬盤升級攻略:提升游戲體驗,暢享3A大作 2024-08-29
-
數(shù)睿數(shù)據(jù)參加《系統(tǒng)與軟件工程 低代碼開發(fā)平臺通用技術(shù)要求》國家標(biāo)準(zhǔn)編制 2024-08-29
- NRF52810藍(lán)牙數(shù)字耳機找人定制
預(yù)算:¥30005天前
- 125KW模塊式PCS軟硬件外包開發(fā)
預(yù)算:¥1100000015小時前
- 12V汽車啟動電源項目BMS設(shè)計
預(yù)算:¥50000023小時前
- 數(shù)據(jù)可視化軟件 開發(fā)
預(yù)算:¥5000023小時前
- PLC項目調(diào)試修改
預(yù)算:¥100001天前
- 起動電機控制器開發(fā)
預(yù)算:¥1100001天前