日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OBD技术速成——J1850协议解析软件实现

發布時間:2024/1/23 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OBD技术速成——J1850协议解析软件实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在整理過程中進步,與君共勉!

J1850-PWM和J1850-VPW的通信協議底層時序可以參考:J1850-PWM和J1850-VPW協議底層時序

PWM和VPW的接收可以使用定時器的輸入捕獲功能,將總線收到的信號的脈沖寬度測出,可在中斷中利用狀態機實時解析數據(或者使用外部中斷,上下沿觸發,同時開啟定時器,在外部中斷函數中以定時器的計數值記錄脈沖寬度)
PWM和VPW的發送可以使用定時器的比較輸出功能,以STM32為例,根據發送數據的數據位脈寬改變CCR,到時間了觸發中斷可以在中斷里利用狀態機賦值下一個CCR,達到按協議輸出信號的效果

部分配置如下:

void j1850_rxtimer_config(char *psel_Type) {TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM_ICInitStruct;switch (*psel_Type){case PSEL_TYPE_PWM:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_DeInit(TIM3);TIM_TimeBaseStructure.TIM_Prescaler = 72-1;TIM_TimeBaseStructure.TIM_Period = 0xFFFF;TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;TIM_ICInitStruct.TIM_ICFilter = 0;TIM_ICInitStruct.TIM_Channel = TIM_Channel_4;TIM_ICInit(TIM3, &TIM_ICInitStruct);nvic_Init(TIM3_IRQn,1,0,ENABLE);break;case PSEL_TYPE_VPW:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); nvic_Init(TIM3_IRQn,1,0,DISABLE);TIM_DeInit(TIM3);TIM_TimeBaseStructure.TIM_Prescaler = 72-1;TIM_TimeBaseStructure.TIM_Period = 0xFFFF;TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);nvic_Init(TIM3_IRQn,1,0,ENABLE);break;} }void j1850_txtimer_config(char *psel_Type) {//TIM4_CH1TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStruct;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); nvic_Init(TIM4_IRQn,0,0,DISABLE);TIM_DeInit(TIM4);if (*psel_Type == PSEL_TYPE_PWM)j1850_txTimerIRQHandle = j1850_pwm_tx;else j1850_txTimerIRQHandle = j1850_vpw_tx;TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;TIM_TimeBaseStructure.TIM_Period = 0xFFFF;TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_Timing;TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Disable;TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low;TIM_OC4Init(TIM4, &TIM_OCInitStruct);TIM_ITConfig(TIM4, TIM_IT_CC4, ENABLE);TIM_ClearITPendingBit(TIM4, TIM_IT_Update);nvic_Init(TIM4_IRQn,0,0,ENABLE); }

這里還提供另一種實現思路:
發送部分:
1、開一個定時器TIM1,配置成PWM比較輸出模式,
2、開啟兩個DMA通道,觸發源為TIM1_DMA_update和TIM1_DMA_CC1
3、開2個同樣大數組,一個是周期,一個是脈寬,大小為你要發送的最長數據的8倍,(一個數據為1個bit)
4、將你要發送的數據按順序拆分為2bit一組,對照上面的關系圖將周期和脈寬轉換為定時器的pwm周期和脈寬值,填進表內,別忘了起始和結束脈沖
5、配置2個dma,發送數據量和數據源地址,地址為兩個數組地址,打開dma的發送完成中斷,打開TIM1 CC1,
6、剩下的事情就是讓TIM和DMA自己嗨,等到程序自己進入了dma發送完成中斷就是發送完成了

接收部分:
1、開一個定時器TIM4,配置成輸入捕獲模式,通道CC1和CC2
2、開啟兩個DMA通道,觸發源為TIM_DMA_CC1和TIM_DMA_CC2
3、開啟兩個數組,同發送部分一樣
4、啟動tim的輸入捕獲和dma,等著vpw引腳信號到來,dma會自己將信號的周期和脈寬放入開好的數組內
5、將捕獲到的脈寬和周期還原成原始數據,搞定收工!

總結

以上是生活随笔為你收集整理的OBD技术速成——J1850协议解析软件实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。