Modify using pico C SDK

This commit is contained in:
aixiao 2024-04-16 17:56:53 +08:00
parent 386bbe06ee
commit fe1691a8d4
2 changed files with 86 additions and 99 deletions

View File

@ -26,15 +26,6 @@ unsigned char sif_receive_data[REV_DATA_NUM] = { 0 };
unsigned int H_L_Level_time_cnt = 0; // 高低电平时间计数 unsigned int H_L_Level_time_cnt = 0; // 高低电平时间计数
unsigned int Tosc = TOSC; // 波形时基单元一般带波特率自适应的不会说明高低电平的时间会用一个Tosc时基描述 unsigned int Tosc = TOSC; // 波形时基单元一般带波特率自适应的不会说明高低电平的时间会用一个Tosc时基描述
//如上面的波形图,要求 32Tosc = 0.5ms = 500us
//所以一个Tosc = 500us/32 ≈ 15us而定时器0单次定时时间为5us所以实际一个Tosc = 15us/5us = 3 次
//可以理解为 5us 是人为设置的一个定时器单次定时时间再这个定时时间的基础上又产生了一个实际时基Tosc用在波形上波形基于这个Tosc时基单元
//可以动态的调整高低电平的时间只要Tosc改变992Tosc和32Tosc以及64Tosc对应的时间也会随之改变然后我们反过来思考再不知道波特率的情况下
//去读取同步信号高电平的时间将读到的时间计数H_L_Level_time_cnt * 15us是高电平的真实维持时间 = 32 * Tosc * 5us = SHORT_TIME_NUM * Tosc * 5us
//Tosc = H_L_Level_time_cnt / SHORT_TIME_NUM
//在本案例中,一帧数据 = 992Tosc+32Tosc+(64+32)*8*12Tosc = 10240*Tosc 次
//1秒钟 = 1000000us单次定时 5us则1s / 5us = 200000 次
//则1秒钟可以接收 200000 / (10240 * Tosc) = 200000/10240/Tosc = 19/Tosc 帧数据
uint8_t start_H_L_Level_timming_flag = 0; // 开始高低电平计时标记 uint8_t start_H_L_Level_timming_flag = 0; // 开始高低电平计时标记
uint8_t has_read_bit = 0; // 1-已经读取一个bit位 uint8_t has_read_bit = 0; // 1-已经读取一个bit位
@ -42,12 +33,18 @@ uint8_t read_success = 0; //一帧数据是否读取成功0-不成功
uint8_t is_end_bit = 0; // 结束帧判定 0-未结束,1-结束标志 uint8_t is_end_bit = 0; // 结束帧判定 0-未结束,1-结束标志
void GPIO_SIF_Init(void) void GPIO_SIF_Init(void) {
{ // 初始化 GPIO
gpio_init(SIF_REV_PIN); gpio_init(SIF_REV_PIN);
gpio_set_dir(SIF_REV_PIN, GPIO_OUT);
// 将 GPIO 设置为输入模式
gpio_set_dir(SIF_REV_PIN, GPIO_IN);
// 启用下拉模式
gpio_pull_down(SIF_REV_PIN);
} }
void TIMER_SIF_IRQHandler(void) void TIMER_SIF_IRQHandler(void)
{ {
if (start_H_L_Level_timming_flag == 1) { if (start_H_L_Level_timming_flag == 1) {
@ -63,7 +60,7 @@ void Receive_SIF_Data_Handle(void)
switch (receive_state) // 检测当前接收数据状态 switch (receive_state) // 检测当前接收数据状态
{ {
case INITIAL_STATE: // 初始状态,未接收到同步信息,进行同步判断 case INITIAL_STATE: // 初始状态,未接收到同步信息,进行同步判断
if (DATA_REV_PIN == LOW) //判断接收引脚的电平状态,当读到低电平时,开始计时 if (DATA_REV_PIN == LOW) // 判断接收引脚的电平状态,当读到低电平时,开始计时
{ {
receive_bit_num = REV_BIT_NUM; // 重置bit位计数器 receive_bit_num = REV_BIT_NUM; // 重置bit位计数器
receive_data_num = 0; // 重置接收数据个数 receive_data_num = 0; // 重置接收数据个数
@ -99,13 +96,6 @@ void Receive_SIF_Data_Handle(void)
} else { } else {
if (DATA_REV_PIN == LOW) // 同步信号高电平检测期间读到低电平 if (DATA_REV_PIN == LOW) // 同步信号高电平检测期间读到低电平
{ {
//在同步信号高电平检测期间读到低电平可能有如下状态:
//1、高电平时间短不满32Tosc
//2、高电平时间正好=32Tosc
//3、高电平时间长超过32Tosc
//不管何种状态,都要 调整 Tosc 的值达到波特率自适应
//H_L_Level_time_cnt * 5us 要求是 SHORT_TIME_NUM * Tosc * 5us
//即 H_L_Level_time_cnt = SHORT_TIME_NUM * Tosc
Tosc = H_L_Level_time_cnt / SHORT_TIME_NUM; // 调整 Tosc 的值 Tosc = H_L_Level_time_cnt / SHORT_TIME_NUM; // 调整 Tosc 的值
H_L_Level_time_cnt = 0; // 高低电平计时变量清0 H_L_Level_time_cnt = 0; // 高低电平计时变量清0
receive_state = DATA_REV_STATE; // 进入读取数据码低电平状态 receive_state = DATA_REV_STATE; // 进入读取数据码低电平状态
@ -114,11 +104,6 @@ void Receive_SIF_Data_Handle(void)
break; break;
case DATA_REV_STATE: // 在读取数据码电平期间 case DATA_REV_STATE: // 在读取数据码电平期间
//逻辑"0"为 64Tosc低电平 + 32Tosc高电平
//逻辑"1"为 32Tosc低电平 + 64Tosc高电平
//不管是逻辑"0"还是逻辑"1"周期一样都是32Tosc + 64Tosc = 96Tosc
//可以取中间时间点进行判断96Tosc / 2 = 48Tosc当计数>=48Tosc时读取引脚电平
//如果还没有读取一个bit位且时间计数已经>=48Tosc
if ((has_read_bit == 0) && (H_L_Level_time_cnt >= (HALF_LOGIC_CYCLE * Tosc))) { if ((has_read_bit == 0) && (H_L_Level_time_cnt >= (HALF_LOGIC_CYCLE * Tosc))) {
sif_receive_data_buf[receive_data_num] |= DATA_REV_PIN; sif_receive_data_buf[receive_data_num] |= DATA_REV_PIN;
has_read_bit = 1; has_read_bit = 1;

View File

@ -8,6 +8,8 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include "pico/stdlib.h"
#include "hardware/gpio.h"
#define _SIF_DEBUG_ 1 #define _SIF_DEBUG_ 1