Modify using pico C SDK
This commit is contained in:
parent
386bbe06ee
commit
fe1691a8d4
35
Source/SIF.c
35
Source/SIF.c
@ -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;
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user