Initial commit: TC264 smart car project with IPS200 menu system
- IPS200 display menu with real-time status and parameter settings - Camera image processing and line tracking - IMU attitude solution and PID control - WiFi SPI oscilloscope data transmission
This commit is contained in:
commit
843447835d
660 files changed
+443632
No files matched your search
@@ -0,0 +1,153 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_adc
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#include "Vadc/Adc/IfxVadc_Adc.h"
|
||||
#include "zf_common_debug.h"
|
||||
#include "zf_driver_adc.h"
|
||||
|
||||
#define ADC_SAMPLE_FREQUENCY 10000000 // 最大10Mhz
|
||||
|
||||
uint8 adc_resolution[50];
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 ADC 转换一次
|
||||
// 参数说明 ch 选择 ADC 通道 (详见 zf_driver_adc.h 中枚举 adc_channel_enum 定义)
|
||||
// 返回参数 uint16 转换的 ADC 值
|
||||
// 使用示例 adc_convert(ADC1_CH0_A0);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint16 adc_convert (adc_channel_enum vadc_chn)
|
||||
{
|
||||
Ifx_VADC_RES result;
|
||||
uint8 temp;
|
||||
do
|
||||
{
|
||||
result = IfxVadc_getResult(&MODULE_VADC.G[(vadc_chn / 16)], vadc_chn%16);
|
||||
} while(!result.B.VF);
|
||||
|
||||
temp = 4 - (adc_resolution[vadc_chn] * 2);
|
||||
|
||||
return((result.U&0x0fff)>>temp);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 ADC 均值滤波转换
|
||||
// 参数说明 ch 选择 ADC 通道 (详见 zf_driver_adc.h 中枚举 adc_channel_enum 定义)
|
||||
// 参数说明 count 均值滤波次数
|
||||
// 返回参数 uint16 转换的 ADC 值
|
||||
// 使用示例 adc_mean_filter_convert(ADC1_CH0_A0, 5); // 采集5次 然后返回平均值
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint16 adc_mean_filter_convert (adc_channel_enum vadc_chn, uint8 count)
|
||||
{
|
||||
uint8 i;
|
||||
uint32 sum;
|
||||
|
||||
zf_assert(count);// 断言次数不能为0
|
||||
|
||||
sum = 0;
|
||||
for(i=0; i<count; i++)
|
||||
{
|
||||
sum += adc_convert(vadc_chn);
|
||||
}
|
||||
|
||||
sum = sum/count;
|
||||
|
||||
return (uint16)sum;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 ADC 初始化
|
||||
// 参数说明 ch 选择 ADC 通道 (详见 zf_driver_adc.h 中枚举 adc_channel_enum 定义)
|
||||
// 参数说明 resolution 选择选择通道分辨率(如果同一个 ADC 模块初始化时设置了不同的分辨率 则最后一个初始化的分辨率生效)
|
||||
// 返回参数 void
|
||||
// 使用示例 adc_init(ADC1_CH0_A0, ADC_8BIT); // 初始化 A0 为 ADC1 的 channel0 输入功能 分辨率为8位
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void adc_init (adc_channel_enum vadc_chn, adc_resolution_enum resolution)
|
||||
{
|
||||
static uint8 mudule_init_flag = 0;
|
||||
IfxVadc_Adc vadc;
|
||||
IfxVadc_Adc_Group adcGroup;
|
||||
IfxVadc_Adc_Config adcConfig;
|
||||
|
||||
IfxVadc_Adc_initModuleConfig(&adcConfig, &MODULE_VADC);
|
||||
|
||||
if(!mudule_init_flag)
|
||||
{
|
||||
mudule_init_flag = 1;
|
||||
IfxVadc_Adc_initModule(&vadc, &adcConfig);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
vadc.vadc = adcConfig.vadc;
|
||||
}
|
||||
|
||||
IfxVadc_Adc_GroupConfig adcGroupConfig;
|
||||
IfxVadc_Adc_initGroupConfig(&adcGroupConfig, &vadc);
|
||||
|
||||
adcGroupConfig.groupId = (IfxVadc_GroupId)(vadc_chn / 16);
|
||||
adcGroupConfig.master = adcGroupConfig.groupId;
|
||||
adcGroupConfig.arbiter.requestSlotBackgroundScanEnabled = TRUE;
|
||||
adcGroupConfig.backgroundScanRequest.autoBackgroundScanEnabled = TRUE;
|
||||
adcGroupConfig.backgroundScanRequest.triggerConfig.gatingMode = IfxVadc_GatingMode_always;
|
||||
adcGroupConfig.inputClass[0].resolution = IfxVadc_ChannelResolution_12bit;
|
||||
adcGroupConfig.inputClass[0].sampleTime = 1.0f/ADC_SAMPLE_FREQUENCY;
|
||||
adcGroupConfig.inputClass[1].resolution = IfxVadc_ChannelResolution_12bit;
|
||||
adcGroupConfig.inputClass[1].sampleTime = 1.0f/ADC_SAMPLE_FREQUENCY;
|
||||
|
||||
IfxVadc_Adc_initGroup(&adcGroup, &adcGroupConfig);
|
||||
|
||||
IfxVadc_Adc_ChannelConfig adcChannelConfig;
|
||||
IfxVadc_Adc_Channel adcChannel;
|
||||
IfxVadc_Adc_initChannelConfig(&adcChannelConfig, &adcGroup);
|
||||
|
||||
adcChannelConfig.channelId = (IfxVadc_ChannelId)(vadc_chn%16);
|
||||
adcChannelConfig.resultRegister = (IfxVadc_ChannelResult)(vadc_chn%16);
|
||||
adcChannelConfig.backgroundChannel = TRUE;
|
||||
|
||||
IfxVadc_Adc_initChannel(&adcChannel, &adcChannelConfig);
|
||||
|
||||
unsigned channels = (1 << adcChannelConfig.channelId);
|
||||
unsigned mask = channels;
|
||||
IfxVadc_Adc_setBackgroundScan(&vadc, &adcGroup, channels, mask);
|
||||
|
||||
IfxVadc_Adc_startBackgroundScan(&vadc);
|
||||
|
||||
adc_resolution[vadc_chn] = resolution;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_adc
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#ifndef _zf_driver_adc_h
|
||||
#define _zf_driver_adc_h
|
||||
|
||||
#include "zf_common_typedef.h"
|
||||
|
||||
typedef enum // 枚举ADC通道
|
||||
{
|
||||
// ADC0可选引脚
|
||||
ADC0_CH0_A0 = 0*16 + 0,
|
||||
ADC0_CH1_A1,
|
||||
ADC0_CH2_A2,
|
||||
ADC0_CH3_A3,
|
||||
ADC0_CH4_A4,
|
||||
ADC0_CH5_A5,
|
||||
ADC0_CH6_A6,
|
||||
ADC0_CH7_A7,
|
||||
ADC0_CH8_A8,
|
||||
ADC0_CH10_A10 = 0*16 + 10,
|
||||
ADC0_CH11_A11,
|
||||
ADC0_CH12_A12,
|
||||
ADC0_CH13_A13,
|
||||
|
||||
// ADC1可选引脚
|
||||
ADC1_CH0_A16 = 1*16 + 0,
|
||||
ADC1_CH1_A17 = 1*16 + 1,
|
||||
ADC1_CH4_A20 = 1*16 + 4,
|
||||
ADC1_CH5_A21 = 1*16 + 5,
|
||||
ADC1_CH8_A24 = 1*16 + 8,
|
||||
ADC1_CH9_A25 = 1*16 + 9,
|
||||
|
||||
// ADC2可选引脚
|
||||
ADC2_CH3_A35 = 2*16 + 3,
|
||||
ADC2_CH4_A36,
|
||||
ADC2_CH5_A37,
|
||||
ADC2_CH6_A38,
|
||||
ADC2_CH7_A39,
|
||||
ADC2_CH10_A44 = 2*16 + 10,
|
||||
ADC2_CH11_A45,
|
||||
ADC2_CH12_A46,
|
||||
ADC2_CH13_A47,
|
||||
ADC2_CH14_A48,
|
||||
ADC2_CH15_A49,
|
||||
}adc_channel_enum;
|
||||
|
||||
// 此枚举定义不允许用户修改
|
||||
typedef enum // 枚举ADC通道
|
||||
{
|
||||
ADC_8BIT, // 8位分辨率
|
||||
ADC_10BIT, // 10位分辨率
|
||||
ADC_12BIT, // 12位分辨率
|
||||
}adc_resolution_enum;
|
||||
|
||||
//====================================================ADC 基础函数====================================================
|
||||
uint16 adc_convert (adc_channel_enum vadc_chn); // ADC转换一次
|
||||
uint16 adc_mean_filter_convert (adc_channel_enum vadc_chn, uint8 count); // ADC均值滤波
|
||||
void adc_init (adc_channel_enum vadc_chn, adc_resolution_enum resolution); // ADC初始化
|
||||
//====================================================ADC 基础函数====================================================
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,205 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_delay
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
* 2023-11-28 pudding 修改普通延时逻辑为中断触发,若总中断关闭则使用寄存器循环读取延时
|
||||
********************************************************************************************************************/
|
||||
|
||||
#include "IfxStm.h"
|
||||
#include "IFXSTM_CFG.h"
|
||||
#include "SysSe/Bsp/Bsp.h"
|
||||
#include "zf_common_interrupt.h"
|
||||
#include "zf_driver_delay.h"
|
||||
|
||||
|
||||
#define IFX_INTPRIO_STM0_SR0 220
|
||||
#define IFX_INTPRIO_STM1_SR0 221
|
||||
|
||||
static vuint8 stm0_isr_flag = 1;
|
||||
static vuint8 stm1_isr_flag = 1;
|
||||
|
||||
IFX_INTERRUPT(stm0_isr, 0, IFX_INTPRIO_STM0_SR0)
|
||||
{
|
||||
interrupt_global_enable(0); // 开启中断嵌套
|
||||
IfxStm_clearCompareFlag(&MODULE_STM0, IfxStm_Comparator_0);
|
||||
stm0_isr_flag = 0;
|
||||
}
|
||||
|
||||
IFX_INTERRUPT(stm1_isr, 0, IFX_INTPRIO_STM1_SR0)
|
||||
{
|
||||
interrupt_global_enable(0); // 开启中断嵌套
|
||||
IfxStm_clearCompareFlag(&MODULE_STM1, IfxStm_Comparator_0);
|
||||
stm1_isr_flag = 0;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 system延时函数
|
||||
// 参数说明 time 延时一轮的时间(单位为纳秒,可设置范围0-20000000)
|
||||
// 返回参数 void
|
||||
// 使用示例 无需用户调用,用户请使用h文件中的宏定义 // 100M时钟 最小单位为 10ns
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void system_delay_10ns (uint32 time)
|
||||
{
|
||||
uint32 interrupt_global_state;
|
||||
|
||||
IfxStm_Index stm_index;
|
||||
|
||||
stm_index = (IfxStm_Index)IfxCpu_getCoreId();
|
||||
|
||||
if(areInterruptsEnabled() == 0)
|
||||
{
|
||||
IfxStm_waitTicks(IfxStm_getAddress(stm_index), time);
|
||||
}
|
||||
else
|
||||
{
|
||||
switch(stm_index)
|
||||
{
|
||||
case IfxStm_Index_0:
|
||||
{
|
||||
Ifx_STM *stm_sfr = &MODULE_STM0;
|
||||
stm0_isr_flag = 1;
|
||||
interrupt_global_state = interrupt_global_disable(); // 关闭全局中断
|
||||
stm_sfr->CMP[0].U = stm_sfr->TIM0.U + time;
|
||||
interrupt_global_enable(interrupt_global_state); // 打开全局中断
|
||||
while(stm0_isr_flag);
|
||||
}break;
|
||||
case IfxStm_Index_1:
|
||||
{
|
||||
Ifx_STM *stm_sfr = &MODULE_STM1;
|
||||
stm1_isr_flag = 1;
|
||||
interrupt_global_state = interrupt_global_disable(); // 关闭全局中断
|
||||
stm_sfr->CMP[0].U = stm_sfr->TIM0.U + time;
|
||||
interrupt_global_enable(interrupt_global_state); // 打开全局中断
|
||||
while(stm1_isr_flag);
|
||||
}break;
|
||||
case IfxStm_Index_none: break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 system 微秒 延时函数(访问寄存器)
|
||||
// 参数说明 time 延时时间 单位:us
|
||||
// 返回参数 void
|
||||
// 使用示例 system_delay_us_register(100); // 延时100微秒
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void system_delay_us_register (uint32 time)
|
||||
{
|
||||
IfxStm_Index stm_index;
|
||||
|
||||
stm_index = (IfxStm_Index)IfxCpu_getCoreId();
|
||||
|
||||
IfxStm_waitTicks(IfxStm_getAddress(stm_index), time * 100);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 system 微秒 延时函数(定时器中断)
|
||||
// 参数说明 time 延时时间 单位:us
|
||||
// 返回参数 void
|
||||
// 使用示例 system_delay_us(100); // 延时100微秒
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void system_delay_us (uint32 time)
|
||||
{
|
||||
if(time > 40000000)
|
||||
{
|
||||
while(time > 40000000)
|
||||
{
|
||||
system_delay_10ns(4000000000);
|
||||
time = time - 40000000;
|
||||
}
|
||||
system_delay_10ns(time * 100);
|
||||
}
|
||||
else
|
||||
{
|
||||
system_delay_10ns(time * 100);
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 system 毫秒 延时函数
|
||||
// 参数说明 time 延时时间 单位:ms
|
||||
// 返回参数 void
|
||||
// 使用示例 system_delay_ms(100); // 延时100毫秒
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void system_delay_ms (uint32 time)
|
||||
{
|
||||
if(time > 40000)
|
||||
{
|
||||
while(time > 40000)
|
||||
{
|
||||
system_delay_10ns(4000000000);
|
||||
time = time - 40000;
|
||||
}
|
||||
system_delay_10ns(time * 100000);
|
||||
}
|
||||
else
|
||||
{
|
||||
system_delay_10ns(time * 100000);
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 system 延迟初始化函数
|
||||
// 返回参数 void
|
||||
// 使用示例 system_delay_init();
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void system_delay_init(void)
|
||||
{
|
||||
IfxStm_CompareConfig stmConfig;
|
||||
boolean interrupt_state = disableInterrupts();
|
||||
|
||||
stmConfig.comparator = IfxStm_Comparator_0;
|
||||
stmConfig.compareOffset = IfxStm_ComparatorOffset_0;
|
||||
stmConfig.compareSize = IfxStm_ComparatorSize_32Bits;
|
||||
stmConfig.comparatorInterrupt = IfxStm_ComparatorInterrupt_ir0;
|
||||
stmConfig.ticks = 1;
|
||||
stmConfig.triggerPriority = IFX_INTPRIO_STM0_SR0;
|
||||
stmConfig.typeOfService = IfxSrc_Tos_cpu0;
|
||||
|
||||
IfxStm_initCompare(&MODULE_STM0, &stmConfig);
|
||||
IfxStm_clearCompareFlag(&MODULE_STM0, IfxStm_Comparator_0);
|
||||
|
||||
stmConfig.comparator = IfxStm_Comparator_0;
|
||||
stmConfig.compareOffset = IfxStm_ComparatorOffset_0;
|
||||
stmConfig.compareSize = IfxStm_ComparatorSize_32Bits;
|
||||
stmConfig.comparatorInterrupt = IfxStm_ComparatorInterrupt_ir0;
|
||||
stmConfig.ticks = 1;
|
||||
stmConfig.triggerPriority = IFX_INTPRIO_STM1_SR0;
|
||||
stmConfig.typeOfService = IfxSrc_Tos_cpu1;
|
||||
|
||||
IfxStm_initCompare(&MODULE_STM1, &stmConfig);
|
||||
IfxStm_clearCompareFlag(&MODULE_STM1, IfxStm_Comparator_0);
|
||||
|
||||
restoreInterrupts(interrupt_state);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_delay
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
* 2023-11-28 pudding 新增初始化函数
|
||||
********************************************************************************************************************/
|
||||
|
||||
#ifndef _zf_driver_delay_h_
|
||||
#define _zf_driver_delay_h_
|
||||
|
||||
#include "zf_common_typedef.h"
|
||||
|
||||
//====================================================延时 基础函数====================================================
|
||||
void system_delay (uint32 time, uint32 num);
|
||||
void system_delay_us_register (uint32 time);
|
||||
void system_delay_us (uint32 time);
|
||||
void system_delay_ms (uint32 time);
|
||||
void system_delay_init (void);
|
||||
//====================================================延时 基础函数====================================================
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,347 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_dma
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#include "IfxDma_Dma.h"
|
||||
#include "IfxScuEru.h"
|
||||
#include "isr_config.h"
|
||||
#include "zf_common_debug.h"
|
||||
#include "zf_driver_dma.h"
|
||||
#include <string.h>
|
||||
|
||||
typedef struct
|
||||
{
|
||||
Ifx_DMA_CH linked_list[10]; // DMA链表
|
||||
IfxDma_Dma_Channel channel; // DMA通道句柄
|
||||
}DMA_LINK;
|
||||
|
||||
#if(0 == DMA_INT_SERVICE)
|
||||
#pragma section all "cpu0_dsram"
|
||||
|
||||
#elif(1 == DMA_INT_SERVICE)
|
||||
#pragma section all "cpu1_dsram"
|
||||
|
||||
#endif
|
||||
|
||||
IFX_ALIGN(256) DMA_LINK dma_link_list;
|
||||
IFX_ALIGN(256) DMA_LINK dma_link_list_2;
|
||||
|
||||
|
||||
#pragma section all restore
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 dma初始化
|
||||
// 参数说明 dma_ch 选择DMA通道
|
||||
// 参数说明 source_addr 设置源地址
|
||||
// 参数说明 destination_addr 设置目的地址
|
||||
// 参数说明 exti_pin 设置触发的eru通道
|
||||
// 参数说明 trigger 设置触发方式
|
||||
// 参数说明 dma_count 设置dma搬移次数
|
||||
// 返回参数 uint8
|
||||
// 使用示例 dma_init(MT9V03X_DMA_CH, MT9V03X_DATA_ADD, mt9v03x_image[0], MT9V03X_PCLK_PIN, EXTI_TRIGGER_RISING, MT9V03X_IMAGE_SIZE);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 dma_init (IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, exti_pin_enum exti_pin, exti_trigger_enum trigger, uint32 dma_count)
|
||||
{
|
||||
IfxDma_Dma_Channel dmaChn;
|
||||
|
||||
memset(&dma_link_list, 0, sizeof(dma_link_list));
|
||||
|
||||
exti_init(exti_pin, trigger); // eru触发DMA通道号 在eru文件中设置eru的优先级,即为触发的通道
|
||||
|
||||
IfxDma_Dma_Config dmaConfig;
|
||||
IfxDma_Dma_initModuleConfig(&dmaConfig, &MODULE_DMA);
|
||||
|
||||
IfxDma_Dma dma;
|
||||
IfxDma_Dma_initModule(&dma, &dmaConfig);
|
||||
|
||||
IfxDma_Dma_ChannelConfig cfg;
|
||||
IfxDma_Dma_initChannelConfig(&cfg, &dma);
|
||||
|
||||
uint8 list_num, i;
|
||||
uint32 single_channel_dma_count;
|
||||
|
||||
zf_assert(!(dma_count % 8)); // 传输次数必须为8的倍数
|
||||
|
||||
|
||||
list_num = 1;
|
||||
single_channel_dma_count = dma_count / list_num;
|
||||
if(16384 < single_channel_dma_count)
|
||||
{
|
||||
while(TRUE)
|
||||
{
|
||||
single_channel_dma_count = dma_count / list_num;
|
||||
if((single_channel_dma_count <= 16384) && !(dma_count % list_num))
|
||||
{
|
||||
break;
|
||||
}
|
||||
list_num++;
|
||||
if(list_num > 10)
|
||||
{
|
||||
zf_assert(FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(1 == list_num)
|
||||
{
|
||||
cfg.shadowControl = IfxDma_ChannelShadow_none;
|
||||
cfg.operationMode = IfxDma_ChannelOperationMode_single;
|
||||
cfg.shadowAddress = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
cfg.shadowControl = IfxDma_ChannelShadow_linkedList;
|
||||
cfg.operationMode = IfxDma_ChannelOperationMode_continuous;
|
||||
|
||||
cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list.linked_list[1]);
|
||||
|
||||
}
|
||||
|
||||
cfg.requestMode = IfxDma_ChannelRequestMode_oneTransferPerRequest;
|
||||
cfg.moveSize = IfxDma_ChannelMoveSize_8bit;
|
||||
cfg.busPriority = IfxDma_ChannelBusPriority_high;
|
||||
|
||||
cfg.sourceAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), source_addr);
|
||||
cfg.sourceAddressCircularRange = IfxDma_ChannelIncrementCircular_none;
|
||||
cfg.sourceCircularBufferEnabled = TRUE;
|
||||
|
||||
cfg.destinationAddressIncrementStep = IfxDma_ChannelIncrementStep_1;
|
||||
|
||||
cfg.channelId = (IfxDma_ChannelId)dma_ch;
|
||||
cfg.hardwareRequestEnabled = FALSE;
|
||||
cfg.channelInterruptEnabled = TRUE;
|
||||
cfg.channelInterruptPriority = DMA_INT_PRIO_1;
|
||||
|
||||
|
||||
cfg.channelInterruptTypeOfService = DMA_INT_SERVICE_1;
|
||||
|
||||
|
||||
|
||||
cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr);
|
||||
|
||||
cfg.transferCount = (uint16)single_channel_dma_count;
|
||||
|
||||
IfxDma_Dma_initChannel(&dmaChn, &cfg);
|
||||
|
||||
if(1 < list_num)
|
||||
{
|
||||
i = 0;
|
||||
while(i < list_num)
|
||||
{
|
||||
cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr + single_channel_dma_count * i);
|
||||
if(i == (list_num - 1))
|
||||
{
|
||||
|
||||
cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (uint32)&dma_link_list.linked_list[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (uint32)&dma_link_list.linked_list[i+1]);
|
||||
}
|
||||
cfg.transferCount = (uint16)single_channel_dma_count;
|
||||
|
||||
|
||||
IfxDma_Dma_initLinkedListEntry((void *)&dma_link_list.linked_list[i], &cfg);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
IfxDma_Dma_getSrcPointer(&dmaChn)->B.CLRR = 1;
|
||||
|
||||
|
||||
|
||||
return list_num;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 dma2初始化
|
||||
// 参数说明 dma_ch 选择DMA通道
|
||||
// 参数说明 source_addr 设置源地址
|
||||
// 参数说明 destination_addr 设置目的地址
|
||||
// 参数说明 exti_pin 设置触发的eru通道
|
||||
// 参数说明 trigger 设置触发方式
|
||||
// 参数说明 dma_count 设置dma搬移次数
|
||||
// 返回参数 uint8
|
||||
// 使用示例 dma_init(MT9V03X_DMA_CH, MT9V03X_DATA_ADD, mt9v03x_image[0], MT9V03X_PCLK_PIN, EXTI_TRIGGER_RISING, MT9V03X_IMAGE_SIZE);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 dma_init_2 (IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, exti_pin_enum exti_pin, exti_trigger_enum trigger, uint32 dma_count)
|
||||
{
|
||||
IfxDma_Dma_Channel dmaChn;
|
||||
|
||||
memset(&dma_link_list_2, 0, sizeof(dma_link_list_2));
|
||||
|
||||
exti_init(exti_pin, trigger); // eru触发DMA通道号 在eru文件中设置eru的优先级,即为触发的通道
|
||||
|
||||
IfxDma_Dma_Config dmaConfig;
|
||||
IfxDma_Dma_initModuleConfig(&dmaConfig, &MODULE_DMA);
|
||||
|
||||
IfxDma_Dma dma;
|
||||
IfxDma_Dma_initModule(&dma, &dmaConfig);
|
||||
|
||||
IfxDma_Dma_ChannelConfig cfg;
|
||||
IfxDma_Dma_initChannelConfig(&cfg, &dma);
|
||||
|
||||
uint8 list_num, i;
|
||||
uint32 single_channel_dma_count;
|
||||
|
||||
zf_assert(!(dma_count % 8)); // 传输次数必须为8的倍数
|
||||
|
||||
|
||||
list_num = 1;
|
||||
single_channel_dma_count = dma_count / list_num;
|
||||
if(16384 < single_channel_dma_count)
|
||||
{
|
||||
while(TRUE)
|
||||
{
|
||||
single_channel_dma_count = dma_count / list_num;
|
||||
if((single_channel_dma_count <= 16384) && !(dma_count % list_num))
|
||||
{
|
||||
break;
|
||||
}
|
||||
list_num++;
|
||||
if(list_num > 10)
|
||||
{
|
||||
zf_assert(FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(1 == list_num)
|
||||
{
|
||||
cfg.shadowControl = IfxDma_ChannelShadow_none;
|
||||
cfg.operationMode = IfxDma_ChannelOperationMode_single;
|
||||
cfg.shadowAddress = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
cfg.shadowControl = IfxDma_ChannelShadow_linkedList;
|
||||
cfg.operationMode = IfxDma_ChannelOperationMode_continuous;
|
||||
|
||||
cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (unsigned)&dma_link_list_2.linked_list[1]);
|
||||
|
||||
}
|
||||
|
||||
cfg.requestMode = IfxDma_ChannelRequestMode_oneTransferPerRequest;
|
||||
cfg.moveSize = IfxDma_ChannelMoveSize_8bit;
|
||||
cfg.busPriority = IfxDma_ChannelBusPriority_high;
|
||||
|
||||
cfg.sourceAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), source_addr);
|
||||
cfg.sourceAddressCircularRange = IfxDma_ChannelIncrementCircular_none;
|
||||
cfg.sourceCircularBufferEnabled = TRUE;
|
||||
|
||||
cfg.destinationAddressIncrementStep = IfxDma_ChannelIncrementStep_1;
|
||||
|
||||
cfg.channelId = (IfxDma_ChannelId)dma_ch;
|
||||
cfg.hardwareRequestEnabled = FALSE;
|
||||
cfg.channelInterruptEnabled = TRUE;
|
||||
cfg.channelInterruptPriority = DMA_INT_PRIO_2;
|
||||
|
||||
|
||||
cfg.channelInterruptTypeOfService = DMA_INT_SERVICE_2 ;
|
||||
|
||||
|
||||
|
||||
cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr);
|
||||
|
||||
cfg.transferCount = (uint16)single_channel_dma_count;
|
||||
|
||||
IfxDma_Dma_initChannel(&dmaChn, &cfg);
|
||||
|
||||
if(1 < list_num)
|
||||
{
|
||||
i = 0;
|
||||
while(i < list_num)
|
||||
{
|
||||
cfg.destinationAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), destination_addr + single_channel_dma_count * i);
|
||||
if(i == (list_num - 1))
|
||||
{
|
||||
|
||||
cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (uint32)&dma_link_list_2.linked_list[0]);
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
|
||||
cfg.shadowAddress = IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (uint32)&dma_link_list_2.linked_list[i+1]);
|
||||
|
||||
|
||||
|
||||
}
|
||||
cfg.transferCount = (uint16)single_channel_dma_count;
|
||||
|
||||
IfxDma_Dma_initLinkedListEntry((void *)&dma_link_list_2.linked_list[i], &cfg);
|
||||
|
||||
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
IfxDma_Dma_getSrcPointer(&dmaChn)->B.CLRR = 1;
|
||||
|
||||
return list_num;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 dma 传输禁止
|
||||
// 参数说明 ch 选择 dma 通道 (详见 zf_driver_dma.h 中枚举 dma_channel_enum 定义)
|
||||
// 返回参数 void
|
||||
// 使用示例 dma_disable(MT9V03X_DMA_CH);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void dma_disable (IfxDma_ChannelId dma_ch)
|
||||
{
|
||||
IfxDma_disableChannelTransaction(&MODULE_DMA, dma_ch);
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 dma 传输使能
|
||||
// 参数说明 ch 选择 dma 通道 (详见 zf_driver_dma.h 中枚举 dma_channel_enum 定义)
|
||||
// 返回参数 void
|
||||
// 使用示例 dma_enable(MT9V03X_DMA_CH);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void dma_enable (IfxDma_ChannelId dma_ch)
|
||||
{
|
||||
IfxDma_enableChannelTransaction(&MODULE_DMA, dma_ch);
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_dma
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#ifndef _zf_driver_dma_h_
|
||||
#define _zf_driver_dma_h_
|
||||
|
||||
#include "IfxDma.h"
|
||||
#include "zf_common_typedef.h"
|
||||
#include "zf_driver_exti.h"
|
||||
|
||||
#define clear_dma_flag(dma_ch) (IfxDma_clearChannelInterrupt(&MODULE_DMA, dma_ch))
|
||||
|
||||
#define dma_set_destination(dma_ch, destination_addr) (IfxDma_setChannelDestinationAddress(&MODULE_DMA, (dma_ch), (void *)IFXCPU_GLB_ADDR_DSPR(IfxCpu_getCoreId(), (destination_addr))))
|
||||
|
||||
//====================================================DMA 基础函数====================================================
|
||||
uint8 dma_init (IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, exti_pin_enum eru_pin, exti_trigger_enum trigger, uint32 dma_count);
|
||||
uint8 dma_init_2 (IfxDma_ChannelId dma_ch, uint8 *source_addr, uint8 *destination_addr, exti_pin_enum eru_pin, exti_trigger_enum trigger, uint32 dma_count);
|
||||
void dma_disable (IfxDma_ChannelId dma_ch);
|
||||
void dma_enable (IfxDma_ChannelId dma_ch);
|
||||
//====================================================DMA 基础函数====================================================
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,288 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_encoder
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#include "IfxGpt12_IncrEnc.h"
|
||||
#include "zf_common_debug.h"
|
||||
#include "zf_driver_encoder.h"
|
||||
|
||||
static uint8 encoder_mode[TIM6_ENCODER + 1] = {0};
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 编码器地址设置 内部调用
|
||||
// 参数说明 gptn 选择所使用的GPT12定时器
|
||||
// 参数说明 count_pin 设置计数引脚
|
||||
// 参数说明 dir_pin 设置计数方向引脚
|
||||
// 返回参数 void
|
||||
// 使用示例 encoder_mapping_set(gptn, ch1_pin, ch2_pin);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
static void encoder_mapping_set (encoder_index_enum encoder_n, encoder_channel1_enum ch1_pin, encoder_channel2_enum ch2_pin)
|
||||
{
|
||||
IfxGpt12_TxIn_In *ch1;
|
||||
IfxGpt12_TxEud_In *ch2;
|
||||
|
||||
switch(encoder_n)
|
||||
{
|
||||
case TIM2_ENCODER:
|
||||
{
|
||||
if (TIM2_ENCODER_CH1_P00_7 == ch1_pin) ch1 = &IfxGpt120_T2INA_P00_7_IN;
|
||||
else if (TIM2_ENCODER_CH1_P33_7 == ch1_pin) ch1 = &IfxGpt120_T2INB_P33_7_IN;
|
||||
else zf_assert(FALSE);
|
||||
|
||||
if (TIM2_ENCODER_CH2_P00_8 == ch2_pin) ch2 = &IfxGpt120_T2EUDA_P00_8_IN;
|
||||
else if (TIM2_ENCODER_CH2_P33_6 == ch2_pin) ch2 = &IfxGpt120_T2EUDB_P33_6_IN;
|
||||
else zf_assert(FALSE);
|
||||
}break;
|
||||
|
||||
case TIM3_ENCODER:
|
||||
{
|
||||
if (TIM3_ENCODER_CH1_P02_6 == ch1_pin) ch1 = &IfxGpt120_T3INA_P02_6_IN;
|
||||
else zf_assert(FALSE);
|
||||
|
||||
if (TIM3_ENCODER_CH2_P02_7 == ch2_pin) ch2 = &IfxGpt120_T3EUDA_P02_7_IN;
|
||||
else zf_assert(FALSE);
|
||||
}break;
|
||||
|
||||
case TIM4_ENCODER:
|
||||
{
|
||||
if (TIM4_ENCODER_CH1_P02_8 == ch1_pin) ch1 = &IfxGpt120_T4INA_P02_8_IN;
|
||||
else zf_assert(FALSE);
|
||||
|
||||
if (TIM4_ENCODER_CH2_P00_9 == ch2_pin) ch2 = &IfxGpt120_T4EUDA_P00_9_IN;
|
||||
else if (TIM4_ENCODER_CH2_P33_5 == ch2_pin) ch2 = &IfxGpt120_T4EUDB_P33_5_IN;
|
||||
else zf_assert(FALSE);
|
||||
}break;
|
||||
|
||||
case TIM5_ENCODER:
|
||||
{
|
||||
if (TIM5_ENCODER_CH1_P21_7 == ch1_pin) ch1 = &IfxGpt120_T5INA_P21_7_IN;
|
||||
else if (TIM5_ENCODER_CH1_P10_3 == ch1_pin) ch1 = &IfxGpt120_T5INB_P10_3_IN;
|
||||
else zf_assert(FALSE);
|
||||
|
||||
if (TIM5_ENCODER_CH2_P21_6 == ch2_pin) ch2 = &IfxGpt120_T5EUDA_P21_6_IN;
|
||||
else if (TIM5_ENCODER_CH2_P10_1 == ch2_pin) ch2 = &IfxGpt120_T5EUDB_P10_1_IN;
|
||||
else zf_assert(FALSE);
|
||||
}break;
|
||||
|
||||
case TIM6_ENCODER:
|
||||
{
|
||||
if (TIM6_ENCODER_CH1_P20_3 == ch1_pin) ch1 = &IfxGpt120_T6INA_P20_3_IN;
|
||||
else if (TIM6_ENCODER_CH1_P10_2 == ch1_pin) ch1 = &IfxGpt120_T6INB_P10_2_IN;
|
||||
else zf_assert(FALSE);
|
||||
|
||||
if (TIM6_ENCODER_CH2_P20_0 == ch2_pin) ch2 = &IfxGpt120_T6EUDA_P20_0_IN;
|
||||
else zf_assert(FALSE);
|
||||
}break;
|
||||
}
|
||||
#pragma warning 507
|
||||
|
||||
IfxGpt12_initTxInPinWithPadLevel(ch1, IfxPort_InputMode_pullUp, IfxPort_PadDriver_cmosAutomotiveSpeed1);
|
||||
IfxGpt12_initTxEudInPinWithPadLevel(ch2, IfxPort_InputMode_pullUp, IfxPort_PadDriver_cmosAutomotiveSpeed1);
|
||||
|
||||
#pragma warning default
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 编码器数据采集
|
||||
// 参数说明 gptn 选择所使用的定时器
|
||||
// 返回参数 void
|
||||
// 使用示例 int16 speed; speed = encoder_get_count(TIM2_ENCODER); // 使用T2定时器
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
int16 encoder_get_count (encoder_index_enum encoder_n)
|
||||
{
|
||||
int16 encoder_data = 0;
|
||||
switch(encoder_n)
|
||||
{
|
||||
case TIM2_ENCODER: encoder_data = (int16)IfxGpt12_T2_getTimerValue(&MODULE_GPT120); break;
|
||||
case TIM3_ENCODER: encoder_data = (int16)IfxGpt12_T3_getTimerValue(&MODULE_GPT120); break;
|
||||
case TIM4_ENCODER: encoder_data = (int16)IfxGpt12_T4_getTimerValue(&MODULE_GPT120); break;
|
||||
case TIM5_ENCODER: encoder_data = (int16)IfxGpt12_T5_getTimerValue(&MODULE_GPT120); break;
|
||||
case TIM6_ENCODER: encoder_data = (int16)IfxGpt12_T6_getTimerValue(&MODULE_GPT120); break;
|
||||
default: encoder_data = 0;
|
||||
}
|
||||
|
||||
if(0 == encoder_mode[encoder_n])
|
||||
{
|
||||
encoder_data = encoder_data / 4;
|
||||
}
|
||||
|
||||
return encoder_data;
|
||||
}
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 编码器计数清除
|
||||
// 参数说明 gptn 选择所使用的定时器
|
||||
// 返回参数 void
|
||||
// 使用示例 encoder_clear_count(TIM2_ENCODER);// 使用T2定时器
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void encoder_clear_count (encoder_index_enum encoder_n)
|
||||
{
|
||||
switch(encoder_n)
|
||||
{
|
||||
case TIM2_ENCODER: IfxGpt12_T2_setTimerValue(&MODULE_GPT120, 0); break;
|
||||
case TIM3_ENCODER: IfxGpt12_T3_setTimerValue(&MODULE_GPT120, 0); break;
|
||||
case TIM4_ENCODER: IfxGpt12_T4_setTimerValue(&MODULE_GPT120, 0); break;
|
||||
case TIM5_ENCODER: IfxGpt12_T5_setTimerValue(&MODULE_GPT120, 0); break;
|
||||
case TIM6_ENCODER: IfxGpt12_T6_setTimerValue(&MODULE_GPT120, 0); break;
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 正交编码器采集初始化
|
||||
// 参数说明 encoder_n 选择所使用的GPT12定时器
|
||||
// 参数说明 ch1_pin ENCODER 通道 1
|
||||
// 参数说明 ch2_pin ENCODER 通道 2
|
||||
// 返回参数 void
|
||||
// 使用示例 encoder_quad_init(TIM2_ENCODER, TIM2_ENCODER_CH1_P00_7, TIM2_ENCODER_CH2_P00_8);// 使用T2定时器 P00_7引脚为A通道 P00_8引脚为B通道
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void encoder_quad_init (encoder_index_enum encoder_n, encoder_channel1_enum ch1_pin, encoder_channel2_enum ch2_pin)
|
||||
{
|
||||
// zf_assert(encoder_n <= TIM4_ENCODER); // 完全正交采集仅 TIM2 TIM3 TIM4支持 如果在这里报错 可以尝试使用下面的方向初始化encoder_dir_init
|
||||
|
||||
IfxGpt12_enableModule(&MODULE_GPT120);
|
||||
IfxGpt12_setGpt1BlockPrescaler(&MODULE_GPT120, IfxGpt12_Gpt1BlockPrescaler_4);
|
||||
IfxGpt12_setGpt2BlockPrescaler(&MODULE_GPT120, IfxGpt12_Gpt2BlockPrescaler_4);
|
||||
encoder_mapping_set(encoder_n, ch1_pin, ch2_pin);
|
||||
|
||||
switch(encoder_n)
|
||||
{
|
||||
case TIM2_ENCODER:
|
||||
{
|
||||
IfxGpt12_T2_setCounterInputMode(&MODULE_GPT120, IfxGpt12_IncrementalInterfaceInputMode_bothEdgesTxINOrTxEUD);
|
||||
IfxGpt12_T2_setDirectionSource (&MODULE_GPT120, IfxGpt12_TimerDirectionSource_external);
|
||||
IfxGpt12_T2_setMode (&MODULE_GPT120, IfxGpt12_Mode_incrementalInterfaceEdgeDetection);
|
||||
IfxGpt12_T2_run (&MODULE_GPT120, IfxGpt12_TimerRun_start);
|
||||
}break;
|
||||
|
||||
case TIM3_ENCODER:
|
||||
{
|
||||
IfxGpt12_T3_setCounterInputMode(&MODULE_GPT120, IfxGpt12_IncrementalInterfaceInputMode_bothEdgesTxINOrTxEUD);
|
||||
IfxGpt12_T3_setDirectionSource (&MODULE_GPT120, IfxGpt12_TimerDirectionSource_external);
|
||||
IfxGpt12_T3_setMode (&MODULE_GPT120, IfxGpt12_Mode_incrementalInterfaceEdgeDetection);
|
||||
IfxGpt12_T3_run (&MODULE_GPT120, IfxGpt12_TimerRun_start);
|
||||
}break;
|
||||
|
||||
case TIM4_ENCODER:
|
||||
{
|
||||
IfxGpt12_T4_setCounterInputMode(&MODULE_GPT120, IfxGpt12_IncrementalInterfaceInputMode_bothEdgesTxINOrTxEUD);
|
||||
IfxGpt12_T4_setDirectionSource (&MODULE_GPT120, IfxGpt12_TimerDirectionSource_external);
|
||||
IfxGpt12_T4_setMode (&MODULE_GPT120, IfxGpt12_Mode_incrementalInterfaceEdgeDetection);
|
||||
IfxGpt12_T4_run (&MODULE_GPT120, IfxGpt12_TimerRun_start);
|
||||
}break;
|
||||
|
||||
case TIM5_ENCODER:
|
||||
{
|
||||
IfxGpt12_T5_setCounterInputMode(&MODULE_GPT120, IfxGpt12_IncrementalInterfaceInputMode_bothEdgesTxINOrTxEUD);
|
||||
IfxGpt12_T5_setDirectionSource (&MODULE_GPT120, IfxGpt12_TimerDirectionSource_external);
|
||||
IfxGpt12_T5_setMode (&MODULE_GPT120, IfxGpt12_Mode_incrementalInterfaceEdgeDetection);
|
||||
IfxGpt12_T5_run (&MODULE_GPT120, IfxGpt12_TimerRun_start);
|
||||
}break;
|
||||
|
||||
case TIM6_ENCODER:
|
||||
{
|
||||
IfxGpt12_T6_setCounterInputMode(&MODULE_GPT120, IfxGpt12_IncrementalInterfaceInputMode_bothEdgesTxINOrTxEUD);
|
||||
IfxGpt12_T6_setDirectionSource (&MODULE_GPT120, IfxGpt12_TimerDirectionSource_external);
|
||||
IfxGpt12_T6_setMode (&MODULE_GPT120, IfxGpt12_Mode_incrementalInterfaceEdgeDetection);
|
||||
IfxGpt12_T6_run (&MODULE_GPT120, IfxGpt12_TimerRun_start);
|
||||
}break;
|
||||
}
|
||||
|
||||
encoder_mode[encoder_n] = 0;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 方向编码器采集初始化
|
||||
// 参数说明 encoder_n 选择所使用的GPT12定时器
|
||||
// 参数说明 ch1_pin 设置计数引脚
|
||||
// 参数说明 ch2_pin 设置方向引脚
|
||||
// 返回参数 void
|
||||
// 使用示例 encoder_quad_init(TIM2_ENCODER, TIM2_ENCODER_CH1_P00_7, TIM2_ENCODER_CH2_P00_8);// 使用T2定时器 P00_7引脚进行计数 计数方向使用P00_8引脚
|
||||
// 备注信息 英飞凌系列单片机无需区分正交和方向编码器,此处仅保留接口方便用户使用
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void encoder_dir_init (encoder_index_enum encoder_n, encoder_channel1_enum count_pin, encoder_channel2_enum dir_pin)
|
||||
{
|
||||
IfxGpt12_enableModule(&MODULE_GPT120);
|
||||
IfxGpt12_setGpt1BlockPrescaler(&MODULE_GPT120, IfxGpt12_Gpt1BlockPrescaler_4);
|
||||
IfxGpt12_setGpt2BlockPrescaler(&MODULE_GPT120, IfxGpt12_Gpt2BlockPrescaler_4);
|
||||
encoder_mapping_set(encoder_n, count_pin, dir_pin);
|
||||
|
||||
switch(encoder_n)
|
||||
{
|
||||
case TIM2_ENCODER:
|
||||
{
|
||||
IfxGpt12_T2_setCounterInputMode(&MODULE_GPT120, IfxGpt12_CounterInputMode_risingEdgeTxIN);
|
||||
IfxGpt12_T2_setDirectionSource (&MODULE_GPT120, IfxGpt12_TimerDirectionSource_external);
|
||||
IfxGpt12_T2_setMode (&MODULE_GPT120, IfxGpt12_Mode_counter);
|
||||
IfxGpt12_T2_run (&MODULE_GPT120, IfxGpt12_TimerRun_start);
|
||||
}break;
|
||||
|
||||
case TIM3_ENCODER:
|
||||
{
|
||||
IfxGpt12_T3_setCounterInputMode(&MODULE_GPT120, IfxGpt12_CounterInputMode_risingEdgeTxIN);
|
||||
IfxGpt12_T3_setDirectionSource (&MODULE_GPT120, IfxGpt12_TimerDirectionSource_external);
|
||||
IfxGpt12_T3_setMode (&MODULE_GPT120, IfxGpt12_Mode_counter);
|
||||
IfxGpt12_T3_run (&MODULE_GPT120, IfxGpt12_TimerRun_start);
|
||||
}break;
|
||||
|
||||
case TIM4_ENCODER:
|
||||
{
|
||||
IfxGpt12_T4_setCounterInputMode(&MODULE_GPT120, IfxGpt12_CounterInputMode_risingEdgeTxIN);
|
||||
IfxGpt12_T4_setDirectionSource (&MODULE_GPT120, IfxGpt12_TimerDirectionSource_external);
|
||||
IfxGpt12_T4_setMode (&MODULE_GPT120, IfxGpt12_Mode_counter);
|
||||
IfxGpt12_T4_run (&MODULE_GPT120, IfxGpt12_TimerRun_start);
|
||||
}break;
|
||||
|
||||
case TIM5_ENCODER:
|
||||
{
|
||||
IfxGpt12_T5_setCounterInputMode(&MODULE_GPT120, IfxGpt12_CounterInputMode_risingEdgeTxIN);
|
||||
IfxGpt12_T5_setDirectionSource (&MODULE_GPT120, IfxGpt12_TimerDirectionSource_external);
|
||||
IfxGpt12_T5_setMode (&MODULE_GPT120, IfxGpt12_Mode_counter);
|
||||
IfxGpt12_T5_run (&MODULE_GPT120, IfxGpt12_TimerRun_start);
|
||||
}break;
|
||||
|
||||
case TIM6_ENCODER:
|
||||
{
|
||||
IfxGpt12_T6_setCounterInputMode(&MODULE_GPT120, IfxGpt12_CounterInputMode_risingEdgeTxIN);
|
||||
IfxGpt12_T6_setDirectionSource (&MODULE_GPT120, IfxGpt12_TimerDirectionSource_external);
|
||||
IfxGpt12_T6_setMode (&MODULE_GPT120, IfxGpt12_Mode_counter);
|
||||
IfxGpt12_T6_run (&MODULE_GPT120, IfxGpt12_TimerRun_start);
|
||||
}break;
|
||||
}
|
||||
|
||||
encoder_mode[encoder_n] = 1;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_encoder
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#ifndef _zf_driver_encoder_h_
|
||||
#define _zf_driver_encoder_h_
|
||||
|
||||
#include "zf_common_typedef.h"
|
||||
|
||||
// 此枚举定义不允许用户修改
|
||||
typedef enum // 枚举编码器引脚
|
||||
{
|
||||
TIM2_ENCODER_CH1_P00_7, // T2定时器 计数引脚可选范围
|
||||
TIM2_ENCODER_CH1_P33_7,
|
||||
|
||||
TIM3_ENCODER_CH1_P02_6, // T3定时器 计数引脚可选范围
|
||||
|
||||
TIM4_ENCODER_CH1_P02_8, // T4定时器 计数引脚可选范围
|
||||
|
||||
TIM5_ENCODER_CH1_P21_7, // T5定时器 计数引脚可选范围
|
||||
TIM5_ENCODER_CH1_P10_3,
|
||||
|
||||
TIM6_ENCODER_CH1_P20_3, // T6定时器 计数引脚可选范围
|
||||
TIM6_ENCODER_CH1_P10_2,
|
||||
}encoder_channel1_enum;
|
||||
|
||||
// 此枚举定义不允许用户修改
|
||||
typedef enum // 枚举编码器引脚
|
||||
{
|
||||
TIM2_ENCODER_CH2_P00_8, // T2定时器 计数方向引脚可选范围
|
||||
TIM2_ENCODER_CH2_P33_6,
|
||||
|
||||
TIM3_ENCODER_CH2_P02_7, // T3定时器 计数方向引脚可选范围
|
||||
|
||||
TIM4_ENCODER_CH2_P00_9, // T4定时器 计数方向引脚可选范围
|
||||
TIM4_ENCODER_CH2_P33_5,
|
||||
|
||||
TIM5_ENCODER_CH2_P21_6, // T5定时器 计数方向引脚可选范围
|
||||
TIM5_ENCODER_CH2_P10_1,
|
||||
|
||||
TIM6_ENCODER_CH2_P20_0, // T6定时器 计数方向引脚可选范围
|
||||
}encoder_channel2_enum;
|
||||
|
||||
typedef enum // 枚举 定时器编号
|
||||
{
|
||||
TIM2_ENCODER,
|
||||
TIM3_ENCODER,
|
||||
TIM4_ENCODER,
|
||||
TIM5_ENCODER,
|
||||
TIM6_ENCODER,
|
||||
}encoder_index_enum;
|
||||
|
||||
//====================================================编码器 基础函数====================================================
|
||||
int16 encoder_get_count (encoder_index_enum encoder_n);
|
||||
void encoder_clear_count (encoder_index_enum encoder_n);
|
||||
|
||||
void encoder_quad_init (encoder_index_enum encoder_n, encoder_channel1_enum count_pin, encoder_channel2_enum dir_pin);
|
||||
void encoder_dir_init (encoder_index_enum encoder_n, encoder_channel1_enum ch1_pin, encoder_channel2_enum ch2_pin);
|
||||
//====================================================编码器 基础函数====================================================
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,212 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_exti
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#include "Src/Std/IfxSrc.h"
|
||||
#include "SysSe/Bsp/Bsp.h"
|
||||
#include "isr_config.h"
|
||||
#include "zf_common_debug.h"
|
||||
#include "zf_driver_exti.h"
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 获取端口参数
|
||||
// 返回参数 IfxScu_Req_In
|
||||
// 使用示例 get_exit_pin(ERU_CH0_REQ4_P10_7);
|
||||
// 备注信息 内部调用
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
static IfxScu_Req_In* get_exit_pin (exti_pin_enum exti_pin)
|
||||
{
|
||||
IfxScu_Req_In* get_exit_pin_config;
|
||||
|
||||
switch(exti_pin)
|
||||
{
|
||||
case ERU_CH0_REQ0_P15_4: get_exit_pin_config = &IfxScu_REQ0_P15_4_IN; break;
|
||||
case ERU_CH1_REQ10_P14_3: get_exit_pin_config = &IfxScu_REQ10_P14_3_IN; break;
|
||||
case ERU_CH2_REQ7_P00_4: get_exit_pin_config = &IfxScu_REQ7_P00_4_IN; break;
|
||||
case ERU_CH2_REQ14_P02_1: get_exit_pin_config = &IfxScu_REQ14_P02_1_IN; break;
|
||||
case ERU_CH2_REQ2_P10_2: get_exit_pin_config = &IfxScu_REQ2_P10_2_IN; break;
|
||||
case ERU_CH3_REQ6_P02_0: get_exit_pin_config = &IfxScu_REQ6_P02_0_IN; break;
|
||||
case ERU_CH3_REQ3_P10_3: get_exit_pin_config = &IfxScu_REQ3_P10_3_IN; break;
|
||||
case ERU_CH3_REQ15_P14_1: get_exit_pin_config = &IfxScu_REQ15_P14_1_IN; break;
|
||||
case ERU_CH4_REQ13_P15_5: get_exit_pin_config = &IfxScu_REQ13_P15_5_IN; break;
|
||||
case ERU_CH4_REQ8_P33_7: get_exit_pin_config = &IfxScu_REQ8_P33_7_IN; break;
|
||||
case ERU_CH5_REQ1_P15_8: get_exit_pin_config = &IfxScu_REQ1_P15_8_IN; break;
|
||||
case ERU_CH6_REQ12_P11_10: get_exit_pin_config = &IfxScu_REQ12_P11_10_IN; break;
|
||||
case ERU_CH6_REQ9_P20_0: get_exit_pin_config = &IfxScu_REQ9_P20_0_IN; break;
|
||||
case ERU_CH7_REQ16_P15_1: get_exit_pin_config = &IfxScu_REQ16_P15_1_IN; break;
|
||||
case ERU_CH7_REQ11_P20_9: get_exit_pin_config = &IfxScu_REQ11_P20_9_IN; break;
|
||||
default: zf_assert(FALSE); get_exit_pin_config = NULL;
|
||||
}
|
||||
|
||||
return get_exit_pin_config;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 EXTI 中断使能
|
||||
// 参数说明 pin 选择 EXTI 引脚 (可选择范围由 zf_driver_exti.h 内 exti_pin_enum 枚举值确定)
|
||||
// 返回参数 void
|
||||
// 使用示例 exti_enable(ERU_CH0_REQ4_P10_7);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void exti_enable (exti_pin_enum eru_pin)
|
||||
{
|
||||
IfxScuEru_OutputChannel outputChannel = (IfxScuEru_OutputChannel)(eru_pin/3);
|
||||
|
||||
volatile Ifx_SRC_SRCR *src = &MODULE_SRC.SCU.SCU.ERU[(int)outputChannel % 4];
|
||||
IfxSrc_enable(src);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 EXTI 中断失能
|
||||
// 参数说明 pin 选择 EXTI 引脚 (可选择范围由 zf_driver_exti.h 内 exti_pin_enum 枚举值确定)
|
||||
// 返回参数 void
|
||||
// 使用示例 exti_disable(A0);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void exti_disable (exti_pin_enum eru_pin)
|
||||
{
|
||||
IfxScuEru_OutputChannel outputChannel = (IfxScuEru_OutputChannel)(eru_pin/3);
|
||||
|
||||
volatile Ifx_SRC_SRCR *src = &MODULE_SRC.SCU.SCU.ERU[(int)outputChannel % 4];
|
||||
IfxSrc_disable(src);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 EXTI 失能
|
||||
// 返回参数 void
|
||||
// 使用示例 exti_disable(ERU_CH0_REQ0_P15_4);
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void exti_all_close (void)
|
||||
{
|
||||
volatile Ifx_SRC_SRCR *src;
|
||||
int8 channel;
|
||||
for(channel = 0; channel < 4; channel ++)
|
||||
{
|
||||
src = &MODULE_SRC.SCU.SCU.ERU[channel];
|
||||
IfxSrc_deinit(src);
|
||||
}
|
||||
}
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 EXTI 中断初始化
|
||||
// 参数说明 eru_pin 设置eru通道及引脚
|
||||
// 参数说明 trigger 设置触发方式
|
||||
// 返回参数 void
|
||||
// 使用示例 exti_init(ERU_CH0_REQ0_P15_4, EXTI_TRIGGER_RISING); // eru通道0 使用P15_4引脚,上升沿触发中断
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void exti_init (exti_pin_enum exti_pin, exti_trigger_enum trigger)
|
||||
{
|
||||
boolean interrupt_state = disableInterrupts();
|
||||
|
||||
IfxScu_Req_In *reqPin;
|
||||
|
||||
reqPin = get_exit_pin(exti_pin);
|
||||
|
||||
IfxScuEru_initReqPin(reqPin, IfxPort_InputMode_pullUp);
|
||||
|
||||
IfxScuEru_InputChannel inputChannel = (IfxScuEru_InputChannel)reqPin->channelId;
|
||||
|
||||
IfxScuEru_InputNodePointer triggerSelect = (IfxScuEru_InputNodePointer)(exti_pin/3);
|
||||
IfxScuEru_OutputChannel outputChannel = (IfxScuEru_OutputChannel)(exti_pin/3);
|
||||
|
||||
switch(trigger)
|
||||
{
|
||||
case EXTI_TRIGGER_RISING:
|
||||
{
|
||||
IfxScuEru_disableFallingEdgeDetection(inputChannel);
|
||||
IfxScuEru_enableRisingEdgeDetection(inputChannel);
|
||||
}break;
|
||||
|
||||
case EXTI_TRIGGER_FALLING:
|
||||
{
|
||||
IfxScuEru_enableFallingEdgeDetection(inputChannel);
|
||||
IfxScuEru_disableRisingEdgeDetection(inputChannel);
|
||||
}break;
|
||||
|
||||
case EXTI_TRIGGER_BOTH:
|
||||
{
|
||||
IfxScuEru_enableFallingEdgeDetection(inputChannel);
|
||||
IfxScuEru_enableRisingEdgeDetection(inputChannel);
|
||||
}break;
|
||||
|
||||
default: zf_assert(FALSE);
|
||||
}
|
||||
|
||||
IfxScuEru_enableTriggerPulse(inputChannel);
|
||||
IfxScuEru_connectTrigger(inputChannel, triggerSelect);
|
||||
|
||||
IfxScuEru_setFlagPatternDetection(outputChannel, inputChannel, TRUE);
|
||||
IfxScuEru_enablePatternDetectionTrigger(outputChannel);
|
||||
IfxScuEru_setInterruptGatingPattern(outputChannel, IfxScuEru_InterruptGatingPattern_alwaysActive);
|
||||
|
||||
|
||||
volatile Ifx_SRC_SRCR *src = &MODULE_SRC.SCU.SCU.ERU[(int)outputChannel % 4];
|
||||
IfxSrc_Tos exit_service;
|
||||
uint8 exit_priority;
|
||||
switch((exti_pin/3)%4)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
exit_service = EXTI_CH0_CH4_INT_SERVICE;
|
||||
exit_priority = EXTI_CH0_CH4_INT_PRIO;
|
||||
}break;
|
||||
|
||||
case 1:
|
||||
{
|
||||
exit_service = EXTI_CH1_CH5_INT_SERVICE;
|
||||
exit_priority = EXTI_CH1_CH5_INT_PRIO;
|
||||
}break;
|
||||
|
||||
case 2:
|
||||
{
|
||||
exit_service = EXTI_CH2_CH6_INT_SERVICE;
|
||||
exit_priority = EXTI_CH2_CH6_INT_PRIO;
|
||||
}break;
|
||||
|
||||
case 3:
|
||||
{
|
||||
exit_service = EXTI_CH3_CH7_INT_SERVICE;
|
||||
exit_priority = EXTI_CH3_CH7_INT_PRIO;
|
||||
}break;
|
||||
|
||||
}
|
||||
#pragma warning 507
|
||||
IfxSrc_init(src, exit_service, exit_priority);
|
||||
#pragma warning default
|
||||
IfxSrc_enable(src);
|
||||
|
||||
restoreInterrupts(interrupt_state);
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_exti
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#ifndef _zf_driver_exti_h_
|
||||
#define _zf_driver_exti_h_
|
||||
|
||||
#include "IfxScuEru.h"
|
||||
#include "zf_common_typedef.h"
|
||||
|
||||
typedef enum // 枚举ERU通道
|
||||
{
|
||||
// 一个通道只能选择其中一个引脚作为 外部中断的输入
|
||||
ERU_CH0_REQ0_P15_4 = 0*3 + 1, // 通道0可选引脚
|
||||
ERU_CH1_REQ10_P14_3 = 1*3 + 1, // 通道1可选引脚
|
||||
// 特别注意通道2 与 通道3都被摄像头占用
|
||||
// 特别注意通道2 与 通道3都被摄像头占用
|
||||
// 特别注意通道2 与 通道3都被摄像头占用
|
||||
ERU_CH2_REQ7_P00_4 = 2*3, ERU_CH2_REQ14_P02_1, ERU_CH2_REQ2_P10_2, // 通道2可选引脚
|
||||
ERU_CH3_REQ6_P02_0 = 3*3, ERU_CH3_REQ3_P10_3, ERU_CH3_REQ15_P14_1, // 通道3可选引脚
|
||||
|
||||
// 通道4与通道0 共用中断函数 在中断内通过判断标志位来识别是哪个通道触发的中断
|
||||
ERU_CH4_REQ13_P15_5 = 4*3, ERU_CH4_REQ8_P33_7, // 通道4可选引脚
|
||||
// 通道5与通道1 共用中断函数
|
||||
ERU_CH5_REQ1_P15_8 = 5*3, // 通道5可选引脚
|
||||
// 通道6与通道2 共用中断函数
|
||||
ERU_CH6_REQ12_P11_10 = 6*3, ERU_CH6_REQ9_P20_0, // 通道6可选引脚
|
||||
// 通道7与通道3 共用中断函数
|
||||
ERU_CH7_REQ16_P15_1 = 7*3, ERU_CH7_REQ11_P20_9, // 通道7可选引脚
|
||||
}exti_pin_enum;
|
||||
|
||||
|
||||
|
||||
typedef enum // 枚举触发方式
|
||||
{
|
||||
EXTI_TRIGGER_RISING, // 上升沿触发模式
|
||||
EXTI_TRIGGER_FALLING, // 下降沿触发模式
|
||||
EXTI_TRIGGER_BOTH, // 双边沿触发模式
|
||||
}exti_trigger_enum;
|
||||
|
||||
|
||||
|
||||
// 中断标志位获取
|
||||
#define exti_flag_get(eru_pin) IfxScuEru_getEventFlagStatus((IfxScuEru_InputChannel)(eru_pin/3))
|
||||
// 中断标志位清除
|
||||
#define exti_flag_clear(eru_pin) IfxScuEru_clearEventFlag((IfxScuEru_InputChannel)(eru_pin/3))
|
||||
|
||||
//====================================================EXIT 基础函数====================================================
|
||||
void exti_all_close (void); // EXTI 失能
|
||||
void exti_enable (exti_pin_enum eru_pin); // EXTI 中断使能
|
||||
void exti_disable (exti_pin_enum eru_pin); // EXTI 中断失能
|
||||
void exti_init (exti_pin_enum eru_pin, exti_trigger_enum trigger); // EXTI 中断初始化
|
||||
//====================================================EXIT 基础函数====================================================
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,213 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_flash
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
* 2023-07-14 pudding 修复之前不完整的断言判断以及错误的注释内容
|
||||
* 2023-07-15 pudding 写入时单独增加是否擦除判断,防止用户使用报错
|
||||
********************************************************************************************************************/
|
||||
|
||||
#include "IfxScuWdt.h"
|
||||
#include "IfxFlash.h"
|
||||
#include "zf_common_debug.h"
|
||||
#include "zf_driver_flash.h"
|
||||
|
||||
|
||||
|
||||
flash_data_union flash_union_buffer[EEPROM_PAGE_LENGTH]; // FLASH 操作的数据缓冲区
|
||||
static uint8 flash_erase_page_flag; // FLASH 擦除页标志位 如果用户没有主动擦除后再写入 则帮用户擦除
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 校验FLASH页是否有数据
|
||||
// 参数说明 sector_num 仅可填写0 此处扇区编号并无实际作用,只是留出接口
|
||||
// 参数说明 page_num 需要写入的页编号 参数范围0-11
|
||||
// 返回参数 返回1有数据,返回0没有数据,如果需要对有数据的区域写入新的数据则应该对所在扇区进行擦除操作
|
||||
// 使用示例 flash_check(0, 0); // 校验0页是否有数据
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 flash_check (uint32 sector_num, uint32 page_num)
|
||||
{
|
||||
zf_assert(EEPROM_PAGE_NUM > page_num);
|
||||
|
||||
uint32 sector_addr = IfxFlash_dFlashTableEepLog[page_num].start;
|
||||
|
||||
uint32 num = 0;
|
||||
|
||||
for(num = 0; num < EEPROM_PAGE_LENGTH && *(uint32 *)(sector_addr + num * FLASH_DATA_SIZE) == 0; num ++);
|
||||
|
||||
return num == EEPROM_PAGE_LENGTH ? 0 : 1;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 擦除页
|
||||
// 参数说明 sector_num 仅可填写0 此处扇区编号并无实际作用,只是留出接口
|
||||
// 参数说明 page_num 需要写入的页编号 参数范围0-11
|
||||
// 返回参数 void
|
||||
// 使用示例 flash_erase_page(0, 0);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void flash_erase_page (uint32 sector_num, uint32 page_num)
|
||||
{
|
||||
zf_assert(EEPROM_PAGE_NUM > page_num);
|
||||
|
||||
uint32 flash = 0;
|
||||
uint16 end_init_sfty_pw;
|
||||
uint32 sector_addr = IfxFlash_dFlashTableEepLog[page_num].start;
|
||||
|
||||
end_init_sfty_pw = IfxScuWdt_getSafetyWatchdogPassword();
|
||||
|
||||
IfxScuWdt_clearSafetyEndinit(end_init_sfty_pw);
|
||||
IfxFlash_eraseSector (sector_addr);
|
||||
IfxScuWdt_setSafetyEndinit (end_init_sfty_pw);
|
||||
|
||||
IfxFlash_waitUnbusy(flash, IfxFlash_FlashType_D0);
|
||||
|
||||
flash_erase_page_flag = 1;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 读取一页
|
||||
// 参数说明 sector_num 仅可填写0 此处扇区编号并无实际作用,只是留出接口
|
||||
// 参数说明 page_num 当前扇区页的编号 参数范围 <0 - 11>
|
||||
// 参数说明 buf 需要读取的数据地址 传入的数组类型必须为uint32
|
||||
// 参数说明 len 需要写入的数据长度 参数范围 1-1023
|
||||
// 返回参数 void
|
||||
// 使用示例 flash_read_page(0, 11, data_buffer, 256);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void flash_read_page(uint32 sector_num, uint32 page_num, uint32 *buf, uint16 len)
|
||||
{
|
||||
uint32 data_cont = 0;
|
||||
zf_assert(EEPROM_PAGE_NUM > page_num);
|
||||
zf_assert(EEPROM_PAGE_LENGTH >= len);
|
||||
|
||||
for(data_cont = 0; data_cont < len; data_cont ++)
|
||||
{
|
||||
*buf ++ = *((uint32 *)((EEPROM_BASE_ADDR + page_num * EEPROM_PAGE_SIZE) + (data_cont * FLASH_DATA_SIZE)));
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 编程一页
|
||||
// 参数说明 sector_num 仅可填写0 此处扇区编号并无实际作用,只是留出接口
|
||||
// 参数说明 page_num 当前扇区页的编号 参数范围 <0 - 11>
|
||||
// 参数说明 buf 需要写入的数据地址 传入的数组类型必须为 uint32
|
||||
// 参数说明 len 需要写入的数据长度 参数范围 1-1024
|
||||
// 返回参数 void
|
||||
// 使用示例 flash_write_page(0, 0, buf, 10);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void flash_write_page (uint32 sector_num, uint32 page_num, const uint32 *buf, uint16 len)
|
||||
{
|
||||
zf_assert(EEPROM_PAGE_NUM > page_num);
|
||||
zf_assert(EEPROM_PAGE_LENGTH >= len);
|
||||
|
||||
uint16 end_init_sfty_pw;
|
||||
uint32 flash_addr = IfxFlash_dFlashTableEepLog[page_num].start;
|
||||
uint32 data_addr = 0;
|
||||
uint32 data_cont = 0;
|
||||
end_init_sfty_pw = IfxScuWdt_getSafetyWatchdogPassword();
|
||||
|
||||
if(flash_erase_page_flag == 0 && flash_check(sector_num, page_num))
|
||||
{
|
||||
flash_erase_page(sector_num, page_num);
|
||||
}
|
||||
|
||||
for(data_cont = 0; data_cont < len; data_cont ++)
|
||||
{
|
||||
data_addr = flash_addr + data_cont * FLASH_DATA_SIZE;
|
||||
|
||||
zf_assert(0 == IfxFlash_enterPageMode(data_addr));
|
||||
|
||||
IfxFlash_waitUnbusy(0, IfxFlash_FlashType_D0);
|
||||
|
||||
IfxFlash_loadPage(data_addr, *buf ++, 0);
|
||||
|
||||
IfxScuWdt_clearSafetyEndinit(end_init_sfty_pw);
|
||||
IfxFlash_writePage (data_addr);
|
||||
IfxScuWdt_setSafetyEndinit (end_init_sfty_pw);
|
||||
|
||||
IfxFlash_waitUnbusy(0, IfxFlash_FlashType_D0);
|
||||
}
|
||||
|
||||
flash_erase_page_flag = 0;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 从指定 FLASH 的扇区的指定页码读取数据到缓冲区
|
||||
// 参数说明 sector_num 仅可填写0 此处扇区编号并无实际作用,只是留出接口
|
||||
// 参数说明 page_num 当前扇区页的编号 参数范围 <0 - 11>
|
||||
// 返回参数 void
|
||||
// 使用示例 flash_read_page_to_buffer(0, 11);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void flash_read_page_to_buffer (uint32 sector_num, uint32 page_num)
|
||||
{
|
||||
uint32 data_cont = 0;
|
||||
zf_assert(EEPROM_PAGE_NUM > page_num);
|
||||
|
||||
uint32 flash_addr = IfxFlash_dFlashTableEepLog[page_num].start; // 提取当前 Flash 地址
|
||||
|
||||
for(data_cont = 0; data_cont < EEPROM_PAGE_LENGTH; data_cont ++)
|
||||
{
|
||||
flash_union_buffer[data_cont].uint32_type = *((uint32 *)(flash_addr + (data_cont * FLASH_DATA_SIZE)));
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 向指定 FLASH 的扇区的指定页码写入缓冲区的数据
|
||||
// 参数说明 sector_num 仅可填写0 此处扇区编号并无实际作用,只是留出接口
|
||||
// 参数说明 page_num 当前扇区页的编号 参数范围 <0 - 11>
|
||||
// 返回参数 uint8 1-表示失败 0-表示成功
|
||||
// 使用示例 flash_write_page_from_buffer(0, 11);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 flash_write_page_from_buffer (uint32 sector_num, uint32 page_num)
|
||||
{
|
||||
uint32 *data_pointer = (uint32 *)flash_union_buffer;
|
||||
|
||||
flash_write_page(0, page_num, data_pointer, EEPROM_PAGE_LENGTH);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 清空数据缓冲区
|
||||
// 参数说明 void
|
||||
// 返回参数 void
|
||||
// 使用示例 flash_buffer_clear();
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void flash_buffer_clear (void)
|
||||
{
|
||||
memset(flash_union_buffer, 0xFF, EEPROM_PAGE_LENGTH);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_flash
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
* 2023-07-14 pudding 修复错误的注释
|
||||
********************************************************************************************************************/
|
||||
|
||||
#ifndef _zf_driver_flash_h_
|
||||
#define _zf_driver_flash_h_
|
||||
|
||||
#include "ifxFlash_cfg.h"
|
||||
#include "zf_common_typedef.h"
|
||||
|
||||
#define EEPROM_BASE_ADDR (IFXFLASH_DFLASH_START)
|
||||
#define EEPROM_SIZE (IFXFLASH_DFLASH_SIZE) // 一共有96KB
|
||||
#define EEPROM_PAGE_SIZE (EEPROM_SIZE / IFXFLASH_DFLASH_NUM_LOG_SECTORS)
|
||||
#define EEPROM_PAGE_NUM (IFXFLASH_DFLASH_NUM_LOG_SECTORS) // 96KB分为了12页
|
||||
|
||||
#define FLASH_DATA_SIZE (IFXFLASH_DFLASH_PAGE_LENGTH)
|
||||
#define EEPROM_PAGE_LENGTH (EEPROM_PAGE_SIZE/FLASH_DATA_SIZE) // 每页可以存1024个uint32类型的数据
|
||||
|
||||
|
||||
typedef union // 固定的数据缓冲单元格式
|
||||
{
|
||||
float float_type; // float 类型
|
||||
uint32 uint32_type; // uint32 类型
|
||||
int32 int32_type; // int32 类型
|
||||
uint16 uint16_type; // uint16 类型
|
||||
int16 int16_type; // int16 类型
|
||||
uint8 uint8_type; // uint8 类型
|
||||
int8 int8_type; // int8 类型
|
||||
}flash_data_union; // 所有类型数据共用同一个 32bit 地址
|
||||
|
||||
extern flash_data_union flash_union_buffer[EEPROM_PAGE_LENGTH];
|
||||
|
||||
//====================================================FLASH 基础函数====================================================
|
||||
uint8 flash_check (uint32 sector_num, uint32 page_num); // 校验FLASH页是否有数据
|
||||
void flash_erase_page (uint32 sector_num, uint32 page_num); // 擦除页
|
||||
void flash_read_page (uint32 sector_num, uint32 page_num, uint32 *buf, uint16 len); // 读取一页
|
||||
void flash_write_page (uint32 sector_num, uint32 page_num, const uint32 *buf, uint16 len); // 编程一页
|
||||
void flash_read_page_to_buffer (uint32 sector_num, uint32 page_num); // 从指定 FLASH 的指定页码读取数据到缓冲区
|
||||
uint8 flash_write_page_from_buffer (uint32 sector_num, uint32 page_num); // 向指定 FLASH 的扇区的指定页码写入缓冲区的数据
|
||||
void flash_buffer_clear (void); // 清空数据缓冲区
|
||||
//====================================================FALSH 基础函数====================================================
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,195 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_gpio
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#include "zf_driver_gpio.h"
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 获取GPIO基地址
|
||||
// 参数说明 pin 选择的引脚 (可选择范围由 zf_driver_gpio.h 内gpio_pin_enum枚举值确定)
|
||||
// 返回参数 void
|
||||
// 使用示例 get_port(P00_0)
|
||||
// 备注信息 本函数在文件内部调用 用户不用关注 也不可修改
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
Ifx_P* get_port (gpio_pin_enum pin)
|
||||
{
|
||||
volatile Ifx_P *port;
|
||||
|
||||
switch(pin&0xffe0)
|
||||
{
|
||||
case P00_0: port = &MODULE_P00; break;
|
||||
case P02_0: port = &MODULE_P02; break;
|
||||
case P10_0: port = &MODULE_P10; break;
|
||||
case P11_0: port = &MODULE_P11; break;
|
||||
case P13_0: port = &MODULE_P13; break;
|
||||
case P14_0: port = &MODULE_P14; break;
|
||||
case P15_0: port = &MODULE_P15; break;
|
||||
case P20_0: port = &MODULE_P20; break;
|
||||
case P21_0: port = &MODULE_P21; break;
|
||||
case P22_0: port = &MODULE_P22; break;
|
||||
case P23_0: port = &MODULE_P23; break;
|
||||
case P32_0: port = &MODULE_P32; break;
|
||||
case P33_0: port = &MODULE_P33; break;
|
||||
default:break;
|
||||
}
|
||||
#pragma warning 507
|
||||
return port;
|
||||
#pragma warning default
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 gpio 输出设置
|
||||
// 参数说明 pin 选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
|
||||
// 参数说明 dat 0:低电平 1:高电平
|
||||
// 返回参数 void
|
||||
// 使用示例 gpio_set_level(P00_0, 1);// P00_0 输出高电平
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void gpio_set_level (gpio_pin_enum pin, uint8 dat)
|
||||
{
|
||||
if(dat)
|
||||
{
|
||||
IfxPort_setPinHigh(get_port(pin), pin&0x1f);
|
||||
}
|
||||
else
|
||||
{
|
||||
IfxPort_setPinLow(get_port(pin), pin&0x1f);
|
||||
}
|
||||
}
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 gpio 电平获取
|
||||
// 参数说明 pin 选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
|
||||
// 返回参数 uint8 引脚当前电平
|
||||
// 使用示例 uint8 status = gpio_get_level(P00_0);// 获取P00_0引脚电平
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 gpio_get_level (gpio_pin_enum pin)
|
||||
{
|
||||
return IfxPort_getPinState(get_port(pin), pin&0x1f);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 gpio 翻转电平
|
||||
// 参数说明 pin 选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
|
||||
// 返回参数 void
|
||||
// 使用示例 gpio_toggle_level(P00_0);// P00_0引脚电平翻转
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void gpio_toggle_level (gpio_pin_enum pin)
|
||||
{
|
||||
IfxPort_togglePin(get_port(pin), pin&0x1f);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 gpio 方向设置
|
||||
// 参数说明 pin 选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
|
||||
// 参数说明 dir 引脚的方向 输出:GPO 输入:GPI
|
||||
// 参数说明 mode 引脚的模式 (可选择范围由 zf_driver_gpio.h 内 gpio_mode_enum 枚举值确定)
|
||||
// 返回参数 void
|
||||
// 使用示例 gpio_dir(P00_0, GPO, GPO_PUSH_PULL);// 设置P00_0为推挽输出模式
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void gpio_set_dir (gpio_pin_enum pin, gpio_dir_enum dir, gpio_mode_enum pinmode)
|
||||
{
|
||||
IfxPort_Mode port_mode;
|
||||
if(dir == GPI)
|
||||
{
|
||||
switch(pinmode)
|
||||
{
|
||||
case GPI_FLOATING_IN:port_mode = IfxPort_Mode_inputNoPullDevice ; break; // 浮空输入
|
||||
case GPI_PULL_DOWN :port_mode = IfxPort_Mode_inputPullDown ; break; // 下拉输入
|
||||
default: port_mode = IfxPort_Mode_inputPullUp ; break; // 默认为上拉输入
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch(pinmode)
|
||||
{
|
||||
case GPO_OPEN_DTAIN :port_mode = IfxPort_Mode_outputOpenDrainGeneral; break;// 开漏输出
|
||||
default: port_mode = IfxPort_Mode_outputPushPullGeneral ; break;// 默认为推挽输出
|
||||
}
|
||||
}
|
||||
|
||||
IfxPort_setPinMode(get_port(pin), pin&0x1f, port_mode);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 gpio 初始化
|
||||
// 参数说明 pin 选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
|
||||
// 参数说明 mode 引脚的方向 [GPI/GPIO]
|
||||
// 参数说明 dat 引脚初始化时设置的电平状态,输出时有效 0:低电平 1:高电平 仅在设置为输出模式时有效
|
||||
// 参数说明 mode 引脚的模式 (可选择范围由 zf_driver_gpio.h 内 gpio_mode_enum 枚举值确定)
|
||||
// 返回参数 void
|
||||
// 使用示例 gpio_init(P00_0, GPO, 1, GPO_PUSH_PULL); // P00_0初始化为GPIO功能、输出模式、输出高电平、推挽输出
|
||||
// 备注信息 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void gpio_init (gpio_pin_enum pin, gpio_dir_enum dir, uint8 dat, gpio_mode_enum pinmode)
|
||||
{
|
||||
IfxPort_Mode port_mode;
|
||||
|
||||
if(dir == GPI)
|
||||
{
|
||||
switch(pinmode)
|
||||
{
|
||||
case GPI_FLOATING_IN:port_mode = IfxPort_Mode_inputNoPullDevice ; break; // 浮空输入
|
||||
case GPI_PULL_DOWN :port_mode = IfxPort_Mode_inputPullDown ; break; // 下拉输入
|
||||
default: port_mode = IfxPort_Mode_inputPullUp ; break; // 默认为上拉输入
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch(pinmode)
|
||||
{
|
||||
case GPO_OPEN_DTAIN :port_mode = IfxPort_Mode_outputOpenDrainGeneral; break;// 开漏输出
|
||||
default: port_mode = IfxPort_Mode_outputPushPullGeneral ; break;// 默认为推挽输出
|
||||
}
|
||||
}
|
||||
|
||||
IfxPort_setPinMode(get_port(pin), pin&0x1f, port_mode);
|
||||
|
||||
IfxPort_setPinPadDriver(get_port(pin), pin&0x1f, IfxPort_PadDriver_cmosAutomotiveSpeed1);
|
||||
|
||||
if(dir == GPO)
|
||||
{
|
||||
if(dat)
|
||||
{
|
||||
IfxPort_setPinHigh(get_port(pin), pin&0x1f);
|
||||
}
|
||||
else
|
||||
{
|
||||
IfxPort_setPinLow(get_port(pin), pin&0x1f);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,155 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_gpio
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#ifndef _zf_driver_gpio_h_
|
||||
#define _zf_driver_gpio_h_
|
||||
|
||||
#include "IFXPORT.h"
|
||||
#include "zf_common_typedef.h"
|
||||
|
||||
typedef enum // 枚举端口 此枚举定义不允许用户修改
|
||||
{
|
||||
// 在设置IO时请自行根据硬件确认当前芯片是否具有此IO
|
||||
|
||||
// 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 TC264DA芯片的21.6无法正常使用
|
||||
// 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 TC264DA芯片的21.6无法正常使用
|
||||
// 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 TC264DA芯片的21.6无法正常使用
|
||||
|
||||
P00_0 = 0*32, P00_1, P00_2, P00_3, P00_4, P00_5, P00_6, P00_7,
|
||||
P00_8, P00_9, P00_10, P00_11, P00_12, P00_13, P00_14, P00_15,
|
||||
|
||||
P02_0 = 2*32, P02_1, P02_2, P02_3, P02_4, P02_5, P02_6, P02_7,
|
||||
P02_8, P02_9, P02_10, P02_11, P02_12, P02_13, P02_14, P02_15,
|
||||
|
||||
P10_0 = 10*32, P10_1, P10_2, P10_3, P10_4, P10_5, P10_6, P10_7,
|
||||
P10_8, P10_9, P10_10, P10_11, P10_12, P10_13, P10_14, P10_15,
|
||||
|
||||
P11_0 = 11*32, P11_1, P11_2, P11_3, P11_4, P11_5, P11_6, P11_7,
|
||||
P11_8, P11_9, P11_10, P11_11, P11_12, P11_13, P11_14, P11_15,
|
||||
|
||||
P13_0 = 13*32, P13_1, P13_2, P13_3, P13_4, P13_5, P13_6, P13_7,
|
||||
P13_8, P13_9, P13_10, P13_11, P13_12, P13_13, P13_14, P13_15,
|
||||
|
||||
P14_0 = 14*32, P14_1, P14_2, P14_3, P14_4, P14_5, P14_6, P14_7,
|
||||
P14_8, P14_9, P14_10, P14_11, P14_12, P14_13, P14_14, P14_15,
|
||||
|
||||
P15_0 = 15*32, P15_1, P15_2, P15_3, P15_4, P15_5, P15_6, P15_7,
|
||||
P15_8, P15_9, P15_10, P15_11, P15_12, P15_13, P15_14, P15_15,
|
||||
|
||||
P20_0 = 20*32, P20_1, P20_2, P20_3, P20_4, P20_5, P20_6, P20_7,
|
||||
P20_8, P20_9, P20_10, P20_11, P20_12, P20_13, P20_14, P20_15,
|
||||
|
||||
P21_0 = 21*32, P21_1, P21_2, P21_3, P21_4, P21_5, P21_6, P21_7,
|
||||
P21_8, P21_9, P21_10, P21_11, P21_12, P21_13, P21_14, P21_15,
|
||||
|
||||
P22_0 = 22*32, P22_1, P22_2, P22_3, P22_4, P22_5, P22_6, P22_7,
|
||||
P22_8, P22_9, P22_10, P22_11, P22_12, P22_13, P22_14, P22_15,
|
||||
|
||||
P23_0 = 23*32, P23_1, P23_2, P23_3, P23_4, P23_5, P23_6, P23_7,
|
||||
P23_8, P23_9, P23_10, P23_11, P23_12, P23_13, P23_14, P23_15,
|
||||
|
||||
P32_0 = 32*32, P32_1, P32_2, P32_3, P32_4, P32_5, P32_6, P32_7,
|
||||
P32_8, P32_9, P32_10, P32_11, P32_12, P32_13, P32_14, P32_15,
|
||||
|
||||
P33_0 = 33*32, P33_1, P33_2, P33_3, P33_4, P33_5, P33_6, P33_7,
|
||||
P33_8, P33_9, P33_10, P33_11, P33_12, P33_13, P33_14, P33_15,
|
||||
|
||||
}gpio_pin_enum;
|
||||
|
||||
typedef enum // 枚举端口方向 此枚举定义不允许用户修改
|
||||
{
|
||||
GPI = 0, // 定义管脚输入方向
|
||||
GPO = 1, // 定义管脚输出方向
|
||||
}gpio_dir_enum;
|
||||
|
||||
typedef enum // 枚举端口电平 此枚举定义不允许用户修改
|
||||
{
|
||||
GPIO_LOW = 0, // 定义低电平
|
||||
GPIO_HIGH = 1, // 定义高电平
|
||||
}gpio_level_enum;
|
||||
|
||||
typedef enum // 枚举端口模式 此枚举定义不允许用户修改
|
||||
{
|
||||
GPI_FLOATING_IN, // 定义管脚浮空输入
|
||||
GPI_PULL_UP , // 定义管脚上拉输入
|
||||
GPI_PULL_DOWN , // 定义管脚下拉输入
|
||||
|
||||
GPO_PUSH_PULL , // 定义管脚推挽输出
|
||||
GPO_OPEN_DTAIN , // 定义管脚开漏输出
|
||||
}gpio_mode_enum;
|
||||
|
||||
//====================================================GPIO 快捷函数====================================================
|
||||
Ifx_P* get_port (gpio_pin_enum pin);
|
||||
#define get_port_in_addr(pin) (uint8 *)(&IfxPort_getAddress((IfxPort_Index)(pin/32))->IN + pin%32/8)
|
||||
#define get_port_out_addr(port) (((Ifx_P *)IfxPort_cfg_indexMap[port].module)->OUT.U)
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 对应 IO 置位为高电平
|
||||
// 参数说明 x 选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
|
||||
// 返回参数 void
|
||||
// 使用示例 gpio_high(P00_0);// P00_0 输出高电平
|
||||
// 备注信息
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
#define gpio_high(x) (get_port(x))->OMR.U = 1 << ((x)&0x1f) // GPIO置位 (get_port(x))->OMR.U = 1 << ((x)&0x1f)
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 对应 IO 置位为低电平
|
||||
// 参数说明 x 选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
|
||||
// 返回参数 void
|
||||
// 使用示例 gpio_low(P00_0);// P00_0 输出低电平
|
||||
// 备注信息
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
#define gpio_low(x) (get_port(x))->OMR.U = 65536 << ((x)&0x1f) // GPIO复位 (get_port(x))->OMR.U = 65536 << ((x)&0x1f)
|
||||
|
||||
//====================================================GPIO 快捷函数====================================================
|
||||
|
||||
//====================================================GPIO 基础函数====================================================
|
||||
void gpio_set_level (gpio_pin_enum pin, uint8 dat);
|
||||
uint8 gpio_get_level (gpio_pin_enum pin);
|
||||
void gpio_toggle_level (gpio_pin_enum pin);
|
||||
void gpio_set_dir (gpio_pin_enum pin, gpio_dir_enum dir, gpio_mode_enum pinconf);
|
||||
void gpio_init (gpio_pin_enum pin, gpio_dir_enum dir, uint8 dat, gpio_mode_enum pinconf);
|
||||
//====================================================GPIO 基础函数====================================================
|
||||
|
||||
//==================================================兼容旧版本开源库接口名称=================================================
|
||||
#ifdef COMPATIBLE_WITH_OLDER_VERSIONS
|
||||
#define gpio_set(pin, dat) (gpio_set_level((pin), (dat)))
|
||||
#define gpio_get(pin) (gpio_get_level((pin)))
|
||||
#define gpio_dir(pin, dir, mode) (gpio_set_dir((pin), (dir), (mode)))
|
||||
#define gpio_toggle(pin) (gpio_toggle_level((pin)))
|
||||
#endif
|
||||
//==================================================兼容旧版本开源库接口名称=================================================
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,220 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_pit
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#include "IfxCcu6_Timer.h"
|
||||
#include "SysSe/Bsp/Bsp.h"
|
||||
#include "isr_config.h"
|
||||
#include "zf_driver_pit.h"
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 pit关闭
|
||||
// 参数说明 pit_index 选择CCU6模块
|
||||
// 返回参数 void
|
||||
// 使用示例 pit_close(CCU60_CH0); // 关闭CCU60 通道0的计时器
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void pit_close (pit_index_enum pit_index)
|
||||
{
|
||||
volatile Ifx_CCU6 *module;
|
||||
IfxCcu6_Timer g_Ccu6Timer;
|
||||
|
||||
module = IfxCcu6_getAddress((IfxCcu6_Index)(pit_index / 2));
|
||||
|
||||
g_Ccu6Timer.ccu6 = module;
|
||||
g_Ccu6Timer.timer = (IfxCcu6_TimerId)((pit_index % 2));
|
||||
|
||||
IfxCcu6_Timer_stop(&g_Ccu6Timer);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 pit启动
|
||||
// 参数说明 pit_index 选择CCU6模块
|
||||
// 返回参数 void
|
||||
// 使用示例 pit_start(CCU60_CH0); // 打开CCU60 通道0的计时器
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void pit_start (pit_index_enum pit_index)
|
||||
{
|
||||
volatile Ifx_CCU6 *module;
|
||||
IfxCcu6_Timer g_Ccu6Timer;
|
||||
|
||||
module = IfxCcu6_getAddress((IfxCcu6_Index)(pit_index / 2));
|
||||
|
||||
g_Ccu6Timer.ccu6 = module;
|
||||
g_Ccu6Timer.timer = (IfxCcu6_TimerId)((pit_index % 2));
|
||||
|
||||
IfxCcu6_Timer_start(&g_Ccu6Timer);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 禁止所有pit中断
|
||||
// 返回参数 void
|
||||
// 使用示例 pit_interrupt_all_close();
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void pit_all_close (void)
|
||||
{
|
||||
IfxCcu6_disableModule((Ifx_CCU6 *)IfxCcu6_cfg_indexMap[0].module);
|
||||
IfxCcu6_disableModule((Ifx_CCU6 *)IfxCcu6_cfg_indexMap[1].module);
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 失能pit中断
|
||||
// 参数说明 pit_index 选择CCU6模块
|
||||
// 返回参数 void
|
||||
// 使用示例 pit_disable_interrupt(CCU60_CH0); // 禁止CCU60 通道0的中断
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void pit_disable (pit_index_enum pit_index)
|
||||
{
|
||||
volatile Ifx_CCU6 *module;
|
||||
module = IfxCcu6_getAddress((IfxCcu6_Index)(pit_index / 2));
|
||||
IfxCcu6_disableInterrupt(module, (pit_index % 2) * 2 + 7);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 使能pit中断
|
||||
// 参数说明 pit_index 选择CCU6模块
|
||||
// 返回参数 void
|
||||
// 使用示例 pit_enable_interrupt(CCU60_CH0); // 开启CCU60 通道0的中断
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void pit_enable (pit_index_enum pit_index)
|
||||
{
|
||||
volatile Ifx_CCU6 *module;
|
||||
module = IfxCcu6_getAddress((IfxCcu6_Index)(pit_index / 2));
|
||||
IfxCcu6_enableInterrupt(module, (pit_index % 2) * 2 + 7);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 pit初始化
|
||||
// 参数说明 pit_index 选择CCU6模块
|
||||
// 参数说明 time 周期时间
|
||||
// 返回参数 void
|
||||
// 使用示例 pit_init(CCU60_CH0, 5000); // 设置周期中断5000us
|
||||
// 备注信息 请使用.h文件中 带时间单位的宏定义函数
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void pit_init (pit_index_enum pit_index, uint32 time)
|
||||
{
|
||||
uint8 i;
|
||||
volatile Ifx_CCU6 *module;
|
||||
uint64 timer_input_clk;
|
||||
IfxCcu6_Timer g_Ccu6Timer;
|
||||
IfxCcu6_Timer_Config timerConfig;
|
||||
uint32 timer_period;
|
||||
|
||||
boolean interrupt_state = disableInterrupts();
|
||||
|
||||
module = IfxCcu6_getAddress((IfxCcu6_Index)(pit_index/2));
|
||||
|
||||
IfxCcu6_Timer_initModuleConfig(&timerConfig, module);
|
||||
|
||||
|
||||
|
||||
timer_input_clk = IfxScuCcu_getSpbFrequency();
|
||||
i = 0;
|
||||
while(i < 16)
|
||||
{
|
||||
timer_period = (uint32)(timer_input_clk * time / 1000000);
|
||||
if(timer_period < 0xffff) break;
|
||||
timer_input_clk >>= 1;
|
||||
i++;
|
||||
}
|
||||
if(16 <= i) IFX_ASSERT(IFX_VERBOSE_LEVEL_ERROR, FALSE);
|
||||
|
||||
|
||||
switch(pit_index)
|
||||
{
|
||||
case CCU60_CH0:
|
||||
{
|
||||
timerConfig.interrupt1.typeOfService = CCU6_0_CH0_INT_SERVICE;
|
||||
timerConfig.interrupt1.priority = CCU6_0_CH0_ISR_PRIORITY;
|
||||
break;
|
||||
}
|
||||
case CCU60_CH1:
|
||||
{
|
||||
timerConfig.interrupt2.typeOfService = CCU6_0_CH1_INT_SERVICE;
|
||||
timerConfig.interrupt2.priority = CCU6_0_CH1_ISR_PRIORITY;
|
||||
break;
|
||||
}
|
||||
case CCU61_CH0:
|
||||
{
|
||||
timerConfig.interrupt1.typeOfService = CCU6_1_CH0_INT_SERVICE;
|
||||
timerConfig.interrupt1.priority = CCU6_1_CH0_ISR_PRIORITY;
|
||||
break;
|
||||
}
|
||||
case CCU61_CH1:
|
||||
{
|
||||
timerConfig.interrupt2.typeOfService = CCU6_1_CH1_INT_SERVICE;
|
||||
timerConfig.interrupt2.priority = CCU6_1_CH1_ISR_PRIORITY;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if((pit_index % 2) == 0)
|
||||
{
|
||||
timerConfig.timer = IfxCcu6_TimerId_t12;
|
||||
timerConfig.interrupt1.source = IfxCcu6_InterruptSource_t12PeriodMatch;
|
||||
timerConfig.interrupt1.serviceRequest = IfxCcu6_ServiceRequest_1;
|
||||
timerConfig.base.t12Period = timer_period;
|
||||
timerConfig.base.t12Frequency = (float)timer_input_clk;
|
||||
timerConfig.clock.t12countingInputMode = IfxCcu6_CountingInputMode_internal;
|
||||
}
|
||||
else
|
||||
{
|
||||
timerConfig.timer = IfxCcu6_TimerId_t13;
|
||||
timerConfig.interrupt2.source = IfxCcu6_InterruptSource_t13PeriodMatch;
|
||||
timerConfig.interrupt2.serviceRequest = IfxCcu6_ServiceRequest_2;
|
||||
timerConfig.base.t13Period = timer_period;
|
||||
timerConfig.base.t13Frequency = (float)timer_input_clk;
|
||||
timerConfig.clock.t13countingInputMode = IfxCcu6_CountingInputMode_internal;
|
||||
}
|
||||
timerConfig.timer12.counterValue = 0;
|
||||
timerConfig.timer13.counterValue = 0;
|
||||
timerConfig.trigger.t13InSyncWithT12 = FALSE;
|
||||
|
||||
IfxCcu6_Timer_initModule(&g_Ccu6Timer, &timerConfig);
|
||||
|
||||
restoreInterrupts(interrupt_state);
|
||||
|
||||
Ifx_CPU_DBGSR debug_index;
|
||||
debug_index.U = __mfcr(CPU_DBGSR);
|
||||
if(1 == debug_index.B.DE)
|
||||
{
|
||||
IfxCcu6_setSuspendMode(module, IfxCcu6_SuspendMode_hard);
|
||||
}
|
||||
IfxCcu6_Timer_start(&g_Ccu6Timer);
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_pit
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#ifndef _zf_driver_pit_h_
|
||||
#define _zf_driver_pit_h_
|
||||
|
||||
#include "zf_common_typedef.h"
|
||||
|
||||
typedef enum // 枚举通道号
|
||||
{
|
||||
CCU60_CH0,
|
||||
CCU60_CH1,
|
||||
CCU61_CH0,
|
||||
CCU61_CH1,
|
||||
}pit_index_enum;
|
||||
|
||||
|
||||
#define pit_clear_flag(pit_index) (IfxCcu6_clearInterruptStatusFlag(IfxCcu6_getAddress((IfxCcu6_Index)(pit_index / 2)), (IfxCcu6_InterruptSource)(7+((pit_index % 2)*2))))
|
||||
|
||||
//====================================================PIT 基础函数====================================================
|
||||
void pit_close (pit_index_enum pit_index);
|
||||
void pit_start (pit_index_enum pit_index);
|
||||
void pit_all_close (void);
|
||||
void pit_disable (pit_index_enum pit_index);
|
||||
void pit_enable (pit_index_enum pit_index);
|
||||
void pit_init (pit_index_enum pit_index, uint32 time);
|
||||
//====================================================PIT 基础函数====================================================
|
||||
|
||||
//====================================================PIT 扩展函数====================================================
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 pit_ms初始化
|
||||
// 参数说明 pit_index 选择CCU6模块
|
||||
// 参数说明 time 周期时间(单位:毫秒)
|
||||
// 返回参数 void
|
||||
// 使用示例 pit_ms_init(CCU60_CH0, 5); // 设置周期中断5ms
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
#define pit_ms_init(pit_index, time) pit_init((pit_index), (time*1000)) // (单位为 毫秒)
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 pit_us初始化
|
||||
// 参数说明 pit_index 选择CCU6模块
|
||||
// 参数说明 time 周期时间(单位:微秒)
|
||||
// 返回参数 void
|
||||
// 使用示例 pit_us_init(CCU60_CH0, 5); // 设置周期中断5us
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
#define pit_us_init(pit_index, time) pit_init((pit_index), (time)) // (单位为 微秒)
|
||||
//====================================================PIT 扩展函数====================================================
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,385 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_pwm
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#include "IfxGtm_Atom_Pwm.h"
|
||||
#include "ifxGtm_PinMap.h"
|
||||
#include "zf_common_debug.h"
|
||||
#include "zf_driver_pwm.h"
|
||||
|
||||
#define CMU_CLK_FREQ 20000000.0f // CMU时钟频率
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 获取端口参数
|
||||
// 返回参数 IfxGtm_Atom_ToutMap
|
||||
// 使用示例 get_pwm_pin(ATOM0_CH0_P00_0);
|
||||
// 备注信息 内部调用
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
static IfxGtm_Atom_ToutMap* get_pwm_pin (pwm_channel_enum atom_pin)
|
||||
{
|
||||
IfxGtm_Atom_ToutMap* pwm_pwm_pin_config;
|
||||
|
||||
switch(atom_pin)
|
||||
{
|
||||
case ATOM0_CH0_P00_0: pwm_pwm_pin_config = &IfxGtm_ATOM0_0_TOUT9_P00_0_OUT; break;
|
||||
case ATOM0_CH0_P02_0: pwm_pwm_pin_config = &IfxGtm_ATOM0_0_TOUT0_P02_0_OUT; break;
|
||||
case ATOM0_CH0_P02_8: pwm_pwm_pin_config = &IfxGtm_ATOM0_0_TOUT8_P02_8_OUT; break;
|
||||
case ATOM0_CH0_P14_5: pwm_pwm_pin_config = &IfxGtm_ATOM0_0_TOUT85_P14_5_OUT; break;
|
||||
case ATOM0_CH0_P21_2: pwm_pwm_pin_config = &IfxGtm_ATOM0_0_TOUT53_P21_2_OUT; break;
|
||||
case ATOM0_CH0_P22_1: pwm_pwm_pin_config = &IfxGtm_ATOM0_0_TOUT48_P22_1_OUT; break;
|
||||
|
||||
case ATOM0_CH1_P00_1: pwm_pwm_pin_config = &IfxGtm_ATOM0_1_TOUT10_P00_1_OUT; break;
|
||||
case ATOM0_CH1_P00_2: pwm_pwm_pin_config = &IfxGtm_ATOM0_1_TOUT11_P00_2_OUT; break;
|
||||
case ATOM0_CH1_P02_1: pwm_pwm_pin_config = &IfxGtm_ATOM0_1_TOUT1_P02_1_OUT; break;
|
||||
case ATOM0_CH1_P10_1: pwm_pwm_pin_config = &IfxGtm_ATOM0_1_TOUT103_P10_1_OUT; break;
|
||||
case ATOM0_CH1_P14_4: pwm_pwm_pin_config = &IfxGtm_ATOM0_1_TOUT84_P14_4_OUT; break;
|
||||
case ATOM0_CH1_P21_3: pwm_pwm_pin_config = &IfxGtm_ATOM0_1_TOUT54_P21_3_OUT; break;
|
||||
case ATOM0_CH1_P22_0: pwm_pwm_pin_config = &IfxGtm_ATOM0_1_TOUT47_P22_0_OUT; break;
|
||||
case ATOM0_CH1_P33_9: pwm_pwm_pin_config = &IfxGtm_ATOM0_1_TOUT31_P33_9_OUT; break;
|
||||
|
||||
case ATOM0_CH2_P00_3: pwm_pwm_pin_config = &IfxGtm_ATOM0_2_TOUT12_P00_3_OUT; break;
|
||||
case ATOM0_CH2_P02_2: pwm_pwm_pin_config = &IfxGtm_ATOM0_2_TOUT2_P02_2_OUT; break;
|
||||
case ATOM0_CH2_P10_2: pwm_pwm_pin_config = &IfxGtm_ATOM0_2_TOUT104_P10_2_OUT; break;
|
||||
case ATOM0_CH2_P10_5: pwm_pwm_pin_config = &IfxGtm_ATOM0_2_TOUT107_P10_5_OUT; break;
|
||||
case ATOM0_CH2_P14_3: pwm_pwm_pin_config = &IfxGtm_ATOM0_2_TOUT83_P14_3_OUT; break;
|
||||
case ATOM0_CH2_P21_4: pwm_pwm_pin_config = &IfxGtm_ATOM0_2_TOUT55_P21_4_OUT; break;
|
||||
case ATOM0_CH2_P33_11:pwm_pwm_pin_config = &IfxGtm_ATOM0_2_TOUT33_P33_11_OUT; break;
|
||||
|
||||
case ATOM0_CH3_P00_4: pwm_pwm_pin_config = &IfxGtm_ATOM0_3_TOUT13_P00_4_OUT; break;
|
||||
case ATOM0_CH3_P02_3: pwm_pwm_pin_config = &IfxGtm_ATOM0_3_TOUT3_P02_3_OUT; break;
|
||||
case ATOM0_CH3_P10_3: pwm_pwm_pin_config = &IfxGtm_ATOM0_3_TOUT105_P10_3_OUT; break;
|
||||
case ATOM0_CH3_P10_6: pwm_pwm_pin_config = &IfxGtm_ATOM0_3_TOUT108_P10_6_OUT; break;
|
||||
case ATOM0_CH3_P14_2: pwm_pwm_pin_config = &IfxGtm_ATOM0_3_TOUT82_P14_2_OUT; break;
|
||||
case ATOM0_CH3_P21_5: pwm_pwm_pin_config = &IfxGtm_ATOM0_3_TOUT56_P21_5_OUT; break;
|
||||
case ATOM0_CH3_P22_2: pwm_pwm_pin_config = &IfxGtm_ATOM0_3_TOUT49_P22_2_OUT; break;
|
||||
|
||||
case ATOM0_CH4_P00_5: pwm_pwm_pin_config = &IfxGtm_ATOM0_4_TOUT14_P00_5_OUT; break;
|
||||
case ATOM0_CH4_P02_4: pwm_pwm_pin_config = &IfxGtm_ATOM0_4_TOUT4_P02_4_OUT; break;
|
||||
case ATOM0_CH4_P14_1: pwm_pwm_pin_config = &IfxGtm_ATOM0_4_TOUT81_P14_1_OUT; break;
|
||||
case ATOM0_CH4_P20_3: pwm_pwm_pin_config = &IfxGtm_ATOM0_4_TOUT61_P20_3_OUT; break;
|
||||
case ATOM0_CH4_P21_6: pwm_pwm_pin_config = &IfxGtm_ATOM0_4_TOUT57_P21_6_OUT; break;
|
||||
case ATOM0_CH4_P22_3: pwm_pwm_pin_config = &IfxGtm_ATOM0_4_TOUT50_P22_3_OUT; break;
|
||||
|
||||
case ATOM0_CH5_P00_6: pwm_pwm_pin_config = &IfxGtm_ATOM0_5_TOUT15_P00_6_OUT; break;
|
||||
case ATOM0_CH5_P02_5: pwm_pwm_pin_config = &IfxGtm_ATOM0_5_TOUT5_P02_5_OUT; break;
|
||||
case ATOM0_CH5_P21_7: pwm_pwm_pin_config = &IfxGtm_ATOM0_5_TOUT58_P21_7_OUT; break;
|
||||
case ATOM0_CH5_P32_4: pwm_pwm_pin_config = &IfxGtm_ATOM0_5_TOUT40_P32_4_OUT; break;
|
||||
|
||||
case ATOM0_CH6_P00_7: pwm_pwm_pin_config = &IfxGtm_ATOM0_6_TOUT16_P00_7_OUT; break;
|
||||
case ATOM0_CH6_P02_6: pwm_pwm_pin_config = &IfxGtm_ATOM0_6_TOUT6_P02_6_OUT; break;
|
||||
case ATOM0_CH6_P20_0: pwm_pwm_pin_config = &IfxGtm_ATOM0_6_TOUT59_P20_0_OUT; break;
|
||||
case ATOM0_CH6_P23_1: pwm_pwm_pin_config = &IfxGtm_ATOM0_6_TOUT42_P23_1_OUT; break;
|
||||
|
||||
case ATOM0_CH7_P00_8: pwm_pwm_pin_config = &IfxGtm_ATOM0_7_TOUT17_P00_8_OUT; break;
|
||||
case ATOM0_CH7_P02_7: pwm_pwm_pin_config = &IfxGtm_ATOM0_7_TOUT7_P02_7_OUT; break;
|
||||
case ATOM0_CH7_P20_8: pwm_pwm_pin_config = &IfxGtm_ATOM0_7_TOUT64_P20_8_OUT; break;
|
||||
|
||||
case ATOM1_CH0_P00_0: pwm_pwm_pin_config = &IfxGtm_ATOM1_0_TOUT9_P00_0_OUT; break;
|
||||
case ATOM1_CH0_P02_0: pwm_pwm_pin_config = &IfxGtm_ATOM1_0_TOUT0_P02_0_OUT; break;
|
||||
case ATOM1_CH0_P02_8: pwm_pwm_pin_config = &IfxGtm_ATOM1_0_TOUT8_P02_8_OUT; break;
|
||||
case ATOM1_CH0_P15_5: pwm_pwm_pin_config = &IfxGtm_ATOM1_0_TOUT76_P15_5_OUT; break;
|
||||
case ATOM1_CH0_P15_6: pwm_pwm_pin_config = &IfxGtm_ATOM1_0_TOUT77_P15_6_OUT; break;
|
||||
case ATOM1_CH0_P20_12:pwm_pwm_pin_config = &IfxGtm_ATOM1_0_TOUT68_P20_12_OUT; break;
|
||||
case ATOM1_CH0_P21_2: pwm_pwm_pin_config = &IfxGtm_ATOM1_0_TOUT53_P21_2_OUT; break;
|
||||
case ATOM1_CH0_P22_1: pwm_pwm_pin_config = &IfxGtm_ATOM1_0_TOUT48_P22_1_OUT; break;
|
||||
|
||||
case ATOM1_CH1_P00_1: pwm_pwm_pin_config = &IfxGtm_ATOM1_1_TOUT10_P00_1_OUT; break;
|
||||
case ATOM1_CH1_P00_2: pwm_pwm_pin_config = &IfxGtm_ATOM1_1_TOUT11_P00_2_OUT; break;
|
||||
case ATOM1_CH1_P02_1: pwm_pwm_pin_config = &IfxGtm_ATOM1_1_TOUT1_P02_1_OUT; break;
|
||||
case ATOM1_CH1_P10_1: pwm_pwm_pin_config = &IfxGtm_ATOM1_1_TOUT103_P10_1_OUT; break;
|
||||
case ATOM1_CH1_P14_6: pwm_pwm_pin_config = &IfxGtm_ATOM1_1_TOUT86_P14_6_OUT; break;
|
||||
case ATOM1_CH1_P15_7: pwm_pwm_pin_config = &IfxGtm_ATOM1_1_TOUT78_P15_7_OUT; break;
|
||||
case ATOM1_CH1_P15_8: pwm_pwm_pin_config = &IfxGtm_ATOM1_1_TOUT79_P15_8_OUT; break;
|
||||
case ATOM1_CH1_P20_13:pwm_pwm_pin_config = &IfxGtm_ATOM1_1_TOUT69_P20_13_OUT; break;
|
||||
case ATOM1_CH1_P21_3: pwm_pwm_pin_config = &IfxGtm_ATOM1_1_TOUT54_P21_3_OUT; break;
|
||||
case ATOM1_CH1_P22_0: pwm_pwm_pin_config = &IfxGtm_ATOM1_1_TOUT47_P22_0_OUT; break;
|
||||
case ATOM1_CH1_P33_9: pwm_pwm_pin_config = &IfxGtm_ATOM1_1_TOUT31_P33_9_OUT; break;
|
||||
|
||||
case ATOM1_CH2_P00_3: pwm_pwm_pin_config = &IfxGtm_ATOM1_2_TOUT12_P00_3_OUT; break;
|
||||
case ATOM1_CH2_P02_2: pwm_pwm_pin_config = &IfxGtm_ATOM1_2_TOUT2_P02_2_OUT; break;
|
||||
case ATOM1_CH2_P10_2: pwm_pwm_pin_config = &IfxGtm_ATOM1_2_TOUT104_P10_2_OUT; break;
|
||||
case ATOM1_CH2_P10_5: pwm_pwm_pin_config = &IfxGtm_ATOM1_2_TOUT107_P10_5_OUT; break;
|
||||
case ATOM1_CH2_P14_0: pwm_pwm_pin_config = &IfxGtm_ATOM1_2_TOUT80_P14_0_OUT; break;
|
||||
case ATOM1_CH2_P20_14:pwm_pwm_pin_config = &IfxGtm_ATOM1_2_TOUT70_P20_14_OUT; break;
|
||||
case ATOM1_CH2_P21_4: pwm_pwm_pin_config = &IfxGtm_ATOM1_2_TOUT55_P21_4_OUT; break;
|
||||
case ATOM1_CH2_P33_11:pwm_pwm_pin_config = &IfxGtm_ATOM1_2_TOUT33_P33_11_OUT; break;
|
||||
|
||||
case ATOM1_CH3_P00_4: pwm_pwm_pin_config = &IfxGtm_ATOM1_3_TOUT13_P00_4_OUT; break;
|
||||
case ATOM1_CH3_P02_3: pwm_pwm_pin_config = &IfxGtm_ATOM1_3_TOUT3_P02_3_OUT; break;
|
||||
case ATOM1_CH3_P10_3: pwm_pwm_pin_config = &IfxGtm_ATOM1_3_TOUT105_P10_3_OUT; break;
|
||||
case ATOM1_CH3_P10_6: pwm_pwm_pin_config = &IfxGtm_ATOM1_3_TOUT108_P10_6_OUT; break;
|
||||
case ATOM1_CH3_P15_0: pwm_pwm_pin_config = &IfxGtm_ATOM1_3_TOUT71_P15_0_OUT; break;
|
||||
case ATOM1_CH3_P21_5: pwm_pwm_pin_config = &IfxGtm_ATOM1_3_TOUT56_P21_5_OUT; break;
|
||||
case ATOM1_CH3_P22_2: pwm_pwm_pin_config = &IfxGtm_ATOM1_3_TOUT49_P22_2_OUT; break;
|
||||
|
||||
case ATOM1_CH4_P00_5: pwm_pwm_pin_config = &IfxGtm_ATOM1_4_TOUT14_P00_5_OUT; break;
|
||||
case ATOM1_CH4_P02_4: pwm_pwm_pin_config = &IfxGtm_ATOM1_4_TOUT4_P02_4_OUT; break;
|
||||
case ATOM1_CH4_P15_1: pwm_pwm_pin_config = &IfxGtm_ATOM1_4_TOUT72_P15_1_OUT; break;
|
||||
case ATOM1_CH4_P20_3: pwm_pwm_pin_config = &IfxGtm_ATOM1_4_TOUT61_P20_3_OUT; break;
|
||||
case ATOM1_CH4_P21_6: pwm_pwm_pin_config = &IfxGtm_ATOM1_4_TOUT57_P21_6_OUT; break;
|
||||
case ATOM1_CH4_P22_3: pwm_pwm_pin_config = &IfxGtm_ATOM1_4_TOUT50_P22_3_OUT; break;
|
||||
|
||||
case ATOM1_CH5_P00_6: pwm_pwm_pin_config = &IfxGtm_ATOM1_5_TOUT15_P00_6_OUT; break;
|
||||
case ATOM1_CH5_P02_5: pwm_pwm_pin_config = &IfxGtm_ATOM1_5_TOUT5_P02_5_OUT; break;
|
||||
case ATOM1_CH5_P15_2: pwm_pwm_pin_config = &IfxGtm_ATOM1_5_TOUT73_P15_2_OUT; break;
|
||||
case ATOM1_CH5_P20_9: pwm_pwm_pin_config = &IfxGtm_ATOM1_5_TOUT65_P20_9_OUT; break;
|
||||
case ATOM1_CH5_P21_7: pwm_pwm_pin_config = &IfxGtm_ATOM1_5_TOUT58_P21_7_OUT; break;
|
||||
case ATOM1_CH5_P32_4: pwm_pwm_pin_config = &IfxGtm_ATOM1_5_TOUT40_P32_4_OUT; break;
|
||||
|
||||
case ATOM1_CH6_P00_7: pwm_pwm_pin_config = &IfxGtm_ATOM1_6_TOUT16_P00_7_OUT; break;
|
||||
case ATOM1_CH6_P02_6: pwm_pwm_pin_config = &IfxGtm_ATOM1_6_TOUT6_P02_6_OUT; break;
|
||||
case ATOM1_CH6_P15_3: pwm_pwm_pin_config = &IfxGtm_ATOM1_6_TOUT74_P15_3_OUT; break;
|
||||
case ATOM1_CH6_P20_0: pwm_pwm_pin_config = &IfxGtm_ATOM1_6_TOUT59_P20_0_OUT; break;
|
||||
case ATOM1_CH6_P20_10:pwm_pwm_pin_config = &IfxGtm_ATOM1_6_TOUT66_P20_10_OUT; break;
|
||||
case ATOM1_CH6_P23_1: pwm_pwm_pin_config = &IfxGtm_ATOM1_6_TOUT42_P23_1_OUT; break;
|
||||
|
||||
case ATOM1_CH7_P00_8: pwm_pwm_pin_config = &IfxGtm_ATOM1_7_TOUT17_P00_8_OUT; break;
|
||||
case ATOM1_CH7_P02_7: pwm_pwm_pin_config = &IfxGtm_ATOM1_7_TOUT7_P02_7_OUT; break;
|
||||
case ATOM1_CH7_P15_4: pwm_pwm_pin_config = &IfxGtm_ATOM1_7_TOUT75_P15_4_OUT; break;
|
||||
case ATOM1_CH7_P20_11:pwm_pwm_pin_config = &IfxGtm_ATOM1_7_TOUT67_P20_11_OUT; break;
|
||||
|
||||
case ATOM2_CH0_P00_9: pwm_pwm_pin_config = &IfxGtm_ATOM2_0_TOUT18_P00_9_OUT; break;
|
||||
case ATOM2_CH0_P13_3: pwm_pwm_pin_config = &IfxGtm_ATOM2_0_TOUT94_P13_3_OUT; break;
|
||||
case ATOM2_CH0_P20_12:pwm_pwm_pin_config = &IfxGtm_ATOM2_0_TOUT68_P20_12_OUT; break;
|
||||
case ATOM2_CH0_P33_4: pwm_pwm_pin_config = &IfxGtm_ATOM2_0_TOUT26_P33_4_OUT; break;
|
||||
case ATOM2_CH0_P33_10:pwm_pwm_pin_config = &IfxGtm_ATOM2_0_TOUT32_P33_10_OUT; break;
|
||||
|
||||
case ATOM2_CH1_P11_2: pwm_pwm_pin_config = &IfxGtm_ATOM2_1_TOUT95_P11_2_OUT; break;
|
||||
case ATOM2_CH1_P20_13:pwm_pwm_pin_config = &IfxGtm_ATOM2_1_TOUT69_P20_13_OUT; break;
|
||||
case ATOM2_CH1_P33_5: pwm_pwm_pin_config = &IfxGtm_ATOM2_1_TOUT27_P33_5_OUT; break;
|
||||
|
||||
case ATOM2_CH2_P11_3: pwm_pwm_pin_config = &IfxGtm_ATOM2_2_TOUT96_P11_3_OUT; break;
|
||||
case ATOM2_CH2_P20_14:pwm_pwm_pin_config = &IfxGtm_ATOM2_2_TOUT70_P20_14_OUT; break;
|
||||
case ATOM2_CH2_P33_6: pwm_pwm_pin_config = &IfxGtm_ATOM2_2_TOUT28_P33_6_OUT; break;
|
||||
|
||||
case ATOM2_CH3_P00_12:pwm_pwm_pin_config = &IfxGtm_ATOM2_3_TOUT21_P00_12_OUT; break;
|
||||
case ATOM2_CH3_P11_6: pwm_pwm_pin_config = &IfxGtm_ATOM2_3_TOUT97_P11_6_OUT; break;
|
||||
case ATOM2_CH3_P15_0: pwm_pwm_pin_config = &IfxGtm_ATOM2_3_TOUT71_P15_0_OUT; break;
|
||||
case ATOM2_CH3_P33_7: pwm_pwm_pin_config = &IfxGtm_ATOM2_3_TOUT29_P33_7_OUT; break;
|
||||
|
||||
case ATOM2_CH4_P11_9: pwm_pwm_pin_config = &IfxGtm_ATOM2_4_TOUT98_P11_9_OUT; break;
|
||||
case ATOM2_CH4_P15_1: pwm_pwm_pin_config = &IfxGtm_ATOM2_4_TOUT72_P15_1_OUT; break;
|
||||
case ATOM2_CH4_P33_8: pwm_pwm_pin_config = &IfxGtm_ATOM2_4_TOUT30_P33_8_OUT; break;
|
||||
case ATOM2_CH4_P33_12:pwm_pwm_pin_config = &IfxGtm_ATOM2_4_TOUT34_P33_12_OUT; break;
|
||||
|
||||
case ATOM2_CH5_P11_10:pwm_pwm_pin_config = &IfxGtm_ATOM2_5_TOUT99_P11_10_OUT; break;
|
||||
case ATOM2_CH5_P13_0: pwm_pwm_pin_config = &IfxGtm_ATOM2_5_TOUT91_P13_0_OUT; break;
|
||||
case ATOM2_CH5_P15_2: pwm_pwm_pin_config = &IfxGtm_ATOM2_5_TOUT73_P15_2_OUT; break;
|
||||
case ATOM2_CH5_P20_9: pwm_pwm_pin_config = &IfxGtm_ATOM2_5_TOUT65_P20_9_OUT; break;
|
||||
case ATOM2_CH5_P33_13:pwm_pwm_pin_config = &IfxGtm_ATOM2_5_TOUT35_P33_13_OUT; break;
|
||||
|
||||
case ATOM2_CH6_P11_11:pwm_pwm_pin_config = &IfxGtm_ATOM2_6_TOUT100_P11_11_OUT; break;
|
||||
case ATOM2_CH6_P13_1: pwm_pwm_pin_config = &IfxGtm_ATOM2_6_TOUT92_P13_1_OUT; break;
|
||||
case ATOM2_CH6_P15_3: pwm_pwm_pin_config = &IfxGtm_ATOM2_6_TOUT74_P15_3_OUT; break;
|
||||
case ATOM2_CH6_P20_6: pwm_pwm_pin_config = &IfxGtm_ATOM2_6_TOUT62_P20_6_OUT; break;
|
||||
case ATOM2_CH6_P20_10:pwm_pwm_pin_config = &IfxGtm_ATOM2_6_TOUT66_P20_10_OUT; break;
|
||||
case ATOM2_CH6_P32_0: pwm_pwm_pin_config = &IfxGtm_ATOM2_6_TOUT36_P32_0_OUT; break;
|
||||
|
||||
case ATOM2_CH7_P11_12:pwm_pwm_pin_config = &IfxGtm_ATOM2_7_TOUT101_P11_12_OUT; break;
|
||||
case ATOM2_CH7_P13_2: pwm_pwm_pin_config = &IfxGtm_ATOM2_7_TOUT93_P13_2_OUT; break;
|
||||
case ATOM2_CH7_P15_4: pwm_pwm_pin_config = &IfxGtm_ATOM2_7_TOUT75_P15_4_OUT; break;
|
||||
case ATOM2_CH7_P20_7: pwm_pwm_pin_config = &IfxGtm_ATOM2_7_TOUT63_P20_7_OUT; break;
|
||||
case ATOM2_CH7_P20_8: pwm_pwm_pin_config = &IfxGtm_ATOM2_7_TOUT64_P20_8_OUT; break;
|
||||
case ATOM2_CH7_P20_11:pwm_pwm_pin_config = &IfxGtm_ATOM2_7_TOUT67_P20_11_OUT; break;
|
||||
|
||||
case ATOM3_CH0_P00_9: pwm_pwm_pin_config = &IfxGtm_ATOM3_0_TOUT18_P00_9_OUT; break;
|
||||
case ATOM3_CH0_P13_3: pwm_pwm_pin_config = &IfxGtm_ATOM3_0_TOUT94_P13_3_OUT; break;
|
||||
case ATOM3_CH0_P14_5: pwm_pwm_pin_config = &IfxGtm_ATOM3_0_TOUT85_P14_5_OUT; break;
|
||||
case ATOM3_CH0_P15_5: pwm_pwm_pin_config = &IfxGtm_ATOM3_0_TOUT76_P15_5_OUT; break;
|
||||
case ATOM3_CH0_P15_6: pwm_pwm_pin_config = &IfxGtm_ATOM3_0_TOUT77_P15_6_OUT; break;
|
||||
case ATOM3_CH0_P33_4: pwm_pwm_pin_config = &IfxGtm_ATOM3_0_TOUT26_P33_4_OUT; break;
|
||||
case ATOM3_CH0_P33_10:pwm_pwm_pin_config = &IfxGtm_ATOM3_0_TOUT32_P33_10_OUT; break;
|
||||
|
||||
case ATOM3_CH1_P11_2: pwm_pwm_pin_config = &IfxGtm_ATOM3_1_TOUT95_P11_2_OUT; break;
|
||||
case ATOM3_CH1_P14_4: pwm_pwm_pin_config = &IfxGtm_ATOM3_1_TOUT84_P14_4_OUT; break;
|
||||
case ATOM3_CH1_P14_6: pwm_pwm_pin_config = &IfxGtm_ATOM3_1_TOUT86_P14_6_OUT; break;
|
||||
case ATOM3_CH1_P15_7: pwm_pwm_pin_config = &IfxGtm_ATOM3_1_TOUT78_P15_7_OUT; break;
|
||||
case ATOM3_CH1_P15_8: pwm_pwm_pin_config = &IfxGtm_ATOM3_1_TOUT79_P15_8_OUT; break;
|
||||
case ATOM3_CH1_P33_5: pwm_pwm_pin_config = &IfxGtm_ATOM3_1_TOUT27_P33_5_OUT; break;
|
||||
|
||||
case ATOM3_CH2_P11_3: pwm_pwm_pin_config = &IfxGtm_ATOM3_2_TOUT96_P11_3_OUT; break;
|
||||
case ATOM3_CH2_P14_0: pwm_pwm_pin_config = &IfxGtm_ATOM3_2_TOUT80_P14_0_OUT; break;
|
||||
case ATOM3_CH2_P14_3: pwm_pwm_pin_config = &IfxGtm_ATOM3_2_TOUT83_P14_3_OUT; break;
|
||||
case ATOM3_CH2_P33_6: pwm_pwm_pin_config = &IfxGtm_ATOM3_2_TOUT28_P33_6_OUT; break;
|
||||
|
||||
case ATOM3_CH3_P00_12:pwm_pwm_pin_config = &IfxGtm_ATOM3_3_TOUT21_P00_12_OUT; break;
|
||||
case ATOM3_CH3_P11_6: pwm_pwm_pin_config = &IfxGtm_ATOM3_3_TOUT97_P11_6_OUT; break;
|
||||
case ATOM3_CH3_P14_2: pwm_pwm_pin_config = &IfxGtm_ATOM3_3_TOUT82_P14_2_OUT; break;
|
||||
case ATOM3_CH3_P33_7: pwm_pwm_pin_config = &IfxGtm_ATOM3_3_TOUT29_P33_7_OUT; break;
|
||||
|
||||
case ATOM3_CH4_P11_9: pwm_pwm_pin_config = &IfxGtm_ATOM3_4_TOUT98_P11_9_OUT; break;
|
||||
case ATOM3_CH4_P14_1: pwm_pwm_pin_config = &IfxGtm_ATOM3_4_TOUT81_P14_1_OUT; break;
|
||||
case ATOM3_CH4_P33_8: pwm_pwm_pin_config = &IfxGtm_ATOM3_4_TOUT30_P33_8_OUT; break;
|
||||
case ATOM3_CH4_P33_12:pwm_pwm_pin_config = &IfxGtm_ATOM3_4_TOUT34_P33_12_OUT; break;
|
||||
|
||||
case ATOM3_CH5_P11_10:pwm_pwm_pin_config = &IfxGtm_ATOM3_5_TOUT99_P11_10_OUT; break;
|
||||
case ATOM3_CH5_P13_0: pwm_pwm_pin_config = &IfxGtm_ATOM3_5_TOUT91_P13_0_OUT; break;
|
||||
case ATOM3_CH5_P33_13:pwm_pwm_pin_config = &IfxGtm_ATOM3_5_TOUT35_P33_13_OUT; break;
|
||||
|
||||
case ATOM3_CH6_P11_11:pwm_pwm_pin_config = &IfxGtm_ATOM3_6_TOUT100_P11_11_OUT; break;
|
||||
case ATOM3_CH6_P13_1: pwm_pwm_pin_config = &IfxGtm_ATOM3_6_TOUT92_P13_1_OUT; break;
|
||||
case ATOM3_CH6_P20_6: pwm_pwm_pin_config = &IfxGtm_ATOM3_6_TOUT62_P20_6_OUT; break;
|
||||
case ATOM3_CH6_P32_0: pwm_pwm_pin_config = &IfxGtm_ATOM3_6_TOUT36_P32_0_OUT; break;
|
||||
|
||||
case ATOM3_CH7_P11_12:pwm_pwm_pin_config = &IfxGtm_ATOM3_7_TOUT101_P11_12_OUT; break;
|
||||
case ATOM3_CH7_P13_2: pwm_pwm_pin_config = &IfxGtm_ATOM3_7_TOUT93_P13_2_OUT; break;
|
||||
case ATOM3_CH7_P20_7: pwm_pwm_pin_config = &IfxGtm_ATOM3_7_TOUT63_P20_7_OUT; break;
|
||||
|
||||
default: zf_assert(FALSE); pwm_pwm_pin_config = NULL;
|
||||
}
|
||||
return pwm_pwm_pin_config;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 关闭所有通道的PWM输出
|
||||
// 返回参数 void
|
||||
// 使用示例 pwm_all_channel_close();
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void pwm_all_channel_close (void)
|
||||
{
|
||||
IfxGtm_Atom_Pwm_Config g_atomConfig;
|
||||
IfxGtm_Atom_Pwm_Driver g_atomDriver;
|
||||
|
||||
int index,channel;
|
||||
|
||||
IfxGtm_enable(&MODULE_GTM);
|
||||
|
||||
if(!(MODULE_GTM.CMU.CLK_EN.U & 0x2))
|
||||
{
|
||||
IfxGtm_Cmu_setClkFrequency(&MODULE_GTM, IfxGtm_Cmu_Clk_0, CMU_CLK_FREQ);
|
||||
IfxGtm_Cmu_enableClocks(&MODULE_GTM, IFXGTM_CMU_CLKEN_CLK0);
|
||||
}
|
||||
IfxGtm_Atom_Pwm_initConfig(&g_atomConfig, &MODULE_GTM);
|
||||
|
||||
for(index = 0; index < 4; index++)
|
||||
{
|
||||
for(channel = 0; channel < 8; channel++)
|
||||
{
|
||||
g_atomConfig.atom = index;
|
||||
g_atomConfig.atomChannel = channel;
|
||||
IfxGtm_Atom_Pwm_init(&g_atomDriver, &g_atomConfig);
|
||||
IfxGtm_Atom_Pwm_stop(&g_atomDriver, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 PWM占空比设置
|
||||
// 参数说明 pin 选择 PWM 引脚
|
||||
// 参数说明 duty 设置占空比
|
||||
// 返回参数 void
|
||||
// 使用示例 pwm_set_duty(ATOM0_CH7_P02_7, 5000); // 设置占空比为百分之5000/PWM_DUTY_MAX*100
|
||||
// 备注信息 GTM_ATOM0_PWM_DUTY_MAX宏定义在zf_driver_pwm.h 默认为10000
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void pwm_set_duty (pwm_channel_enum pwmch, uint32 duty)
|
||||
{
|
||||
uint32 period;
|
||||
|
||||
zf_assert(duty <= PWM_DUTY_MAX); // 如果在这里出现了断言,那么说明你输入的占空比已经大于了最大占空比 PWM_DUTY_MAX 宏定义在zf_driver_pwm.h 默认为10000
|
||||
|
||||
IfxGtm_Atom_ToutMap *atom_channel;
|
||||
atom_channel = get_pwm_pin(pwmch);
|
||||
|
||||
period = IfxGtm_Atom_Ch_getCompareZero(&MODULE_GTM.ATOM[atom_channel->atom], atom_channel->channel);
|
||||
|
||||
switch(atom_channel->atom)
|
||||
{
|
||||
case 0: duty = (uint32)((uint64)duty * period / PWM_DUTY_MAX); break;
|
||||
case 1: duty = (uint32)((uint64)duty * period / PWM_DUTY_MAX); break;
|
||||
case 2: duty = (uint32)((uint64)duty * period / PWM_DUTY_MAX); break;
|
||||
case 3: duty = (uint32)((uint64)duty * period / PWM_DUTY_MAX); break;
|
||||
}
|
||||
IfxGtm_Atom_Ch_setCompareOneShadow(&MODULE_GTM.ATOM[atom_channel->atom], atom_channel->channel, duty);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 PWM 初始化
|
||||
// 参数说明 pin 选择 PWM 引脚
|
||||
// 参数说明 freq 设置频率 同个通道只有最后一次设置生效
|
||||
// 参数说明 duty 设置占空比
|
||||
// 返回参数 void
|
||||
// 使用示例 pwm_init(ATOM0_CH7_P02_7, 50, 1000); // ATOM 0模块的通道7 使用P02_7引脚输出PWM PWM频率50HZ 占空比百分之1000/PWM_DUTY_MAX*100
|
||||
// 备注信息 PWM_DUTY_MAX宏定义在zf_driver_pwm.h 默认为10000
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void pwm_init (pwm_channel_enum pwmch, uint32 freq, uint32 duty)
|
||||
{
|
||||
IfxGtm_Atom_Pwm_Config g_atomConfig;
|
||||
IfxGtm_Atom_Pwm_Driver g_atomDriver;
|
||||
|
||||
IfxGtm_Atom_ToutMap *atom_channel;
|
||||
|
||||
zf_assert(duty <= PWM_DUTY_MAX); // 如果在这里出现了断言,那么说明你输入的占空比已经大于了最大占空比 PWM_DUTY_MAX 宏定义在zf_driver_pwm.h 默认为10000
|
||||
|
||||
|
||||
atom_channel = get_pwm_pin(pwmch);
|
||||
|
||||
switch(atom_channel->atom)
|
||||
{
|
||||
case 0: IFX_ASSERT(IFX_VERBOSE_LEVEL_ERROR, duty <= PWM_DUTY_MAX); break;
|
||||
case 1: IFX_ASSERT(IFX_VERBOSE_LEVEL_ERROR, duty <= PWM_DUTY_MAX); break;
|
||||
case 2: IFX_ASSERT(IFX_VERBOSE_LEVEL_ERROR, duty <= PWM_DUTY_MAX); break;
|
||||
case 3: IFX_ASSERT(IFX_VERBOSE_LEVEL_ERROR, duty <= PWM_DUTY_MAX); break;
|
||||
}
|
||||
|
||||
IfxGtm_enable(&MODULE_GTM);
|
||||
|
||||
if(!(MODULE_GTM.CMU.CLK_EN.U & 0x2))
|
||||
{
|
||||
IfxGtm_Cmu_setClkFrequency(&MODULE_GTM, IfxGtm_Cmu_Clk_0, CMU_CLK_FREQ);
|
||||
IfxGtm_Cmu_enableClocks(&MODULE_GTM, IFXGTM_CMU_CLKEN_CLK0);
|
||||
}
|
||||
|
||||
IfxGtm_Atom_Pwm_initConfig(&g_atomConfig, &MODULE_GTM);
|
||||
|
||||
g_atomConfig.atom = atom_channel->atom;
|
||||
g_atomConfig.atomChannel = atom_channel->channel;
|
||||
g_atomConfig.period = CMU_CLK_FREQ/freq;
|
||||
g_atomConfig.pin.outputPin = atom_channel;
|
||||
g_atomConfig.synchronousUpdateEnabled = TRUE;
|
||||
|
||||
switch(atom_channel->atom)
|
||||
{
|
||||
case 0: g_atomConfig.dutyCycle = (uint32)((uint64)duty * g_atomConfig.period / PWM_DUTY_MAX); break;
|
||||
case 1: g_atomConfig.dutyCycle = (uint32)((uint64)duty * g_atomConfig.period / PWM_DUTY_MAX); break;
|
||||
case 2: g_atomConfig.dutyCycle = (uint32)((uint64)duty * g_atomConfig.period / PWM_DUTY_MAX); break;
|
||||
case 3: g_atomConfig.dutyCycle = (uint32)((uint64)duty * g_atomConfig.period / PWM_DUTY_MAX); break;
|
||||
}
|
||||
|
||||
IfxGtm_Atom_Pwm_init(&g_atomDriver, &g_atomConfig);
|
||||
IfxGtm_Atom_Pwm_start(&g_atomDriver, TRUE);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_pwm
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#ifndef _zf_driver_pwm_h_
|
||||
#define _zf_driver_pwm_h_
|
||||
|
||||
#include "zf_common_typedef.h"
|
||||
|
||||
#define PWM_DUTY_MAX 10000 // PWM最大占空比 最大占空比越大占空比的步进值越小
|
||||
|
||||
// 此枚举定义不允许用户修改
|
||||
typedef enum // 枚举PWM引脚
|
||||
{
|
||||
ATOM0_CH0_P00_0, ATOM0_CH0_P02_0, ATOM0_CH0_P02_8, ATOM0_CH0_P14_5, ATOM0_CH0_P21_2, ATOM0_CH0_P22_1,
|
||||
ATOM0_CH1_P00_1, ATOM0_CH1_P00_2, ATOM0_CH1_P02_1, ATOM0_CH1_P10_1, ATOM0_CH1_P14_4, ATOM0_CH1_P21_3, ATOM0_CH1_P22_0, ATOM0_CH1_P33_9,
|
||||
ATOM0_CH2_P00_3, ATOM0_CH2_P02_2, ATOM0_CH2_P10_2, ATOM0_CH2_P10_5, ATOM0_CH2_P14_3, ATOM0_CH2_P21_4, ATOM0_CH2_P33_11,
|
||||
ATOM0_CH3_P00_4, ATOM0_CH3_P02_3, ATOM0_CH3_P10_3, ATOM0_CH3_P10_6, ATOM0_CH3_P14_2, ATOM0_CH3_P21_5, ATOM0_CH3_P22_2,
|
||||
ATOM0_CH4_P00_5, ATOM0_CH4_P02_4, ATOM0_CH4_P14_1, ATOM0_CH4_P20_3, ATOM0_CH4_P21_6, ATOM0_CH4_P22_3,
|
||||
ATOM0_CH5_P00_6, ATOM0_CH5_P02_5, ATOM0_CH5_P21_7, ATOM0_CH5_P32_4,
|
||||
ATOM0_CH6_P00_7, ATOM0_CH6_P02_6, ATOM0_CH6_P20_0, ATOM0_CH6_P23_1,
|
||||
ATOM0_CH7_P00_8, ATOM0_CH7_P02_7, ATOM0_CH7_P20_8,
|
||||
|
||||
ATOM1_CH0_P00_0, ATOM1_CH0_P02_0, ATOM1_CH0_P02_8, ATOM1_CH0_P15_5, ATOM1_CH0_P15_6, ATOM1_CH0_P20_12, ATOM1_CH0_P21_2, ATOM1_CH0_P22_1,
|
||||
ATOM1_CH1_P00_1, ATOM1_CH1_P00_2, ATOM1_CH1_P02_1, ATOM1_CH1_P10_1, ATOM1_CH1_P14_6, ATOM1_CH1_P15_7, ATOM1_CH1_P15_8, ATOM1_CH1_P20_13, ATOM1_CH1_P21_3, ATOM1_CH1_P22_0, ATOM1_CH1_P33_9,
|
||||
ATOM1_CH2_P00_3, ATOM1_CH2_P02_2, ATOM1_CH2_P10_2, ATOM1_CH2_P10_5, ATOM1_CH2_P14_0, ATOM1_CH2_P20_14, ATOM1_CH2_P21_4, ATOM1_CH2_P33_11,
|
||||
ATOM1_CH3_P00_4, ATOM1_CH3_P02_3, ATOM1_CH3_P10_3, ATOM1_CH3_P10_6, ATOM1_CH3_P15_0, ATOM1_CH3_P21_5, ATOM1_CH3_P22_2,
|
||||
ATOM1_CH4_P00_5, ATOM1_CH4_P02_4, ATOM1_CH4_P15_1, ATOM1_CH4_P20_3, ATOM1_CH4_P21_6, ATOM1_CH4_P22_3,
|
||||
ATOM1_CH5_P00_6, ATOM1_CH5_P02_5, ATOM1_CH5_P15_2, ATOM1_CH5_P20_9, ATOM1_CH5_P21_7, ATOM1_CH5_P32_4,
|
||||
ATOM1_CH6_P00_7, ATOM1_CH6_P02_6, ATOM1_CH6_P15_3, ATOM1_CH6_P20_0, ATOM1_CH6_P20_10, ATOM1_CH6_P23_1,
|
||||
ATOM1_CH7_P00_8, ATOM1_CH7_P02_7, ATOM1_CH7_P15_4, ATOM1_CH7_P20_11,
|
||||
|
||||
ATOM2_CH0_P00_9, ATOM2_CH0_P13_3, ATOM2_CH0_P20_12, ATOM2_CH0_P33_4, ATOM2_CH0_P33_10,
|
||||
ATOM2_CH1_P11_2, ATOM2_CH1_P20_13, ATOM2_CH1_P33_5,
|
||||
ATOM2_CH2_P11_3, ATOM2_CH2_P20_14, ATOM2_CH2_P33_6,
|
||||
ATOM2_CH3_P00_12, ATOM2_CH3_P11_6, ATOM2_CH3_P15_0, ATOM2_CH3_P33_7,
|
||||
ATOM2_CH4_P11_9, ATOM2_CH4_P15_1, ATOM2_CH4_P33_8, ATOM2_CH4_P33_12,
|
||||
ATOM2_CH5_P11_10, ATOM2_CH5_P13_0, ATOM2_CH5_P15_2, ATOM2_CH5_P20_9, ATOM2_CH5_P33_13,
|
||||
ATOM2_CH6_P11_11, ATOM2_CH6_P13_1, ATOM2_CH6_P15_3, ATOM2_CH6_P20_6, ATOM2_CH6_P20_10, ATOM2_CH6_P32_0,
|
||||
ATOM2_CH7_P11_12, ATOM2_CH7_P13_2, ATOM2_CH7_P15_4, ATOM2_CH7_P20_7, ATOM2_CH7_P20_8, ATOM2_CH7_P20_11,
|
||||
|
||||
ATOM3_CH0_P00_9, ATOM3_CH0_P13_3, ATOM3_CH0_P14_5, ATOM3_CH0_P15_5, ATOM3_CH0_P15_6, ATOM3_CH0_P33_4, ATOM3_CH0_P33_10,
|
||||
ATOM3_CH1_P11_2, ATOM3_CH1_P14_4, ATOM3_CH1_P14_6, ATOM3_CH1_P15_7, ATOM3_CH1_P15_8, ATOM3_CH1_P33_5,
|
||||
ATOM3_CH2_P11_3, ATOM3_CH2_P14_0, ATOM3_CH2_P14_3, ATOM3_CH2_P33_6,
|
||||
ATOM3_CH3_P00_12, ATOM3_CH3_P11_6, ATOM3_CH3_P14_2, ATOM3_CH3_P33_7,
|
||||
ATOM3_CH4_P11_9, ATOM3_CH4_P14_1, ATOM3_CH4_P33_8, ATOM3_CH4_P33_12,
|
||||
ATOM3_CH5_P11_10, ATOM3_CH5_P13_0, ATOM3_CH5_P33_13,
|
||||
ATOM3_CH6_P11_11, ATOM3_CH6_P13_1, ATOM3_CH6_P20_6, ATOM3_CH6_P32_0,
|
||||
ATOM3_CH7_P11_12, ATOM3_CH7_P13_2, ATOM3_CH7_P20_7,
|
||||
}pwm_channel_enum;
|
||||
|
||||
//====================================================PWM 基础函数====================================================
|
||||
void pwm_all_channel_close (void);
|
||||
void pwm_init (pwm_channel_enum pwmch, uint32 freq, uint32 duty);
|
||||
void pwm_set_duty (pwm_channel_enum pwmch, uint32 duty);
|
||||
//====================================================PWM 基础函数====================================================
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,682 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_soft_iic
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
* 2022-07-06 pudding 修复 soft_iic transfer 函数读取长度为 0 时发送 restart 信号的 bug
|
||||
********************************************************************************************************************/
|
||||
|
||||
#include "zf_common_debug.h"
|
||||
#include "zf_driver_delay.h"
|
||||
#include "zf_driver_soft_iic.h"
|
||||
|
||||
#define soft_iic_gpio_high_scl() ((Ifx_P *)soft_iic_obj->iic_scl)->OMR.U = 1 << ((soft_iic_obj->scl_pin)&0x1f)
|
||||
#define soft_iic_gpio_high_sda() ((Ifx_P *)soft_iic_obj->iic_sda)->OMR.U = 1 << ((soft_iic_obj->sda_pin)&0x1f)
|
||||
#define soft_iic_gpio_low_scl() ((Ifx_P *)soft_iic_obj->iic_scl)->OMR.U = 65536 << ((soft_iic_obj->scl_pin)&0x1f)
|
||||
#define soft_iic_gpio_low_sda() ((Ifx_P *)soft_iic_obj->iic_sda)->OMR.U = 65536 << ((soft_iic_obj->sda_pin)&0x1f)
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 延时
|
||||
// 参数说明 delay 延时次数
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_delay(1);
|
||||
// 备注信息 内部调用
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
#define soft_iic_delay(x) for(vuint32 i = x; i--; )
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC GPIO拉高
|
||||
// 参数说明 x 引脚号
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_soft_iic_gpio_high_scl();
|
||||
// 备注信息 内部调用
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
#define soft_iic_gpio_high(x) soft_iic_obj->iic_scl->OMR.U = 1 << ((x)&0x1f)
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC START 信号
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_start(soft_iic_obj);
|
||||
// 备注信息 内部调用
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
static void soft_iic_start (soft_iic_info_struct *soft_iic_obj)
|
||||
{
|
||||
soft_iic_gpio_high_scl(); // SCL 高电平
|
||||
soft_iic_gpio_high_sda(); // SDA 高电平
|
||||
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
soft_iic_gpio_low_sda(); // SDA 先拉低
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
soft_iic_gpio_low_scl(); // SCL 再拉低
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC STOP 信号
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_stop(soft_iic_obj);
|
||||
// 备注信息 内部调用
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
static void soft_iic_stop (soft_iic_info_struct *soft_iic_obj)
|
||||
{
|
||||
soft_iic_gpio_low_sda(); // SDA 低电平
|
||||
soft_iic_gpio_low_scl(); // SCL 低电平
|
||||
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
soft_iic_gpio_high_scl(); // SCL 先拉高
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
soft_iic_gpio_high_sda(); // SDA 再拉高
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 发送 ACK/NAKC 信号 内部调用
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 ack ACK 电平
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_send_ack(soft_iic_obj, 1);
|
||||
// 备注信息 内部调用
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
static void soft_iic_send_ack (soft_iic_info_struct *soft_iic_obj, uint8 ack)
|
||||
{
|
||||
soft_iic_gpio_low_scl(); // SCL 低电平
|
||||
|
||||
if(ack)
|
||||
{
|
||||
soft_iic_gpio_high_sda(); // SDA 拉高
|
||||
}
|
||||
else
|
||||
{
|
||||
soft_iic_gpio_low_sda(); // SDA 拉低
|
||||
}
|
||||
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
soft_iic_gpio_high_scl(); // SCL 拉高
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
soft_iic_gpio_low_scl(); // SCL 拉低
|
||||
soft_iic_gpio_high_sda(); // SDA 拉高
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 获取 ACK/NAKC 信号
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 返回参数 uint8 ACK 状态
|
||||
// 使用示例 soft_iic_wait_ack(soft_iic_obj);
|
||||
// 备注信息 内部调用
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
static uint8 soft_iic_wait_ack (soft_iic_info_struct *soft_iic_obj)
|
||||
{
|
||||
uint8 temp = 0;
|
||||
soft_iic_gpio_low_scl(); // SCL 低电平
|
||||
soft_iic_gpio_high_sda(); // SDA 高电平 释放 SDA
|
||||
#if SOFT_IIC_SDA_IO_SWITCH
|
||||
gpio_set_dir(soft_iic_obj->sda_pin, GPI, GPI_FLOATING_IN);
|
||||
#endif
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
|
||||
soft_iic_gpio_high_scl(); // SCL 高电平
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
|
||||
if(gpio_get_level(soft_iic_obj->sda_pin))
|
||||
{
|
||||
temp = 1;
|
||||
}
|
||||
soft_iic_gpio_low_scl(); // SCL 低电平
|
||||
#if SOFT_IIC_SDA_IO_SWITCH
|
||||
gpio_set_dir(soft_iic_obj->sda_pin, GPO, GPO_OPEN_DTAIN);
|
||||
#endif
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
|
||||
return temp;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 发送 8bit 数据
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 data 数据
|
||||
// 返回参数 uint8 ACK 状态
|
||||
// 备注信息 内部调用
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
static uint8 soft_iic_send_data (soft_iic_info_struct *soft_iic_obj, const uint8 data)
|
||||
{
|
||||
uint8 temp = 0x80;
|
||||
while(temp)
|
||||
{
|
||||
gpio_set_level(soft_iic_obj->sda_pin, data & temp);
|
||||
temp >>= 1;
|
||||
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
soft_iic_gpio_high_scl(); // SCL 拉高
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
soft_iic_gpio_low_scl(); // SCL 拉低
|
||||
}
|
||||
return ((soft_iic_wait_ack(soft_iic_obj) == 1) ? 0 : 1 );
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 读取 8bit 数据
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 ack ACK 或 NACK
|
||||
// 返回参数 uint8 数据
|
||||
// 备注信息 内部调用
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
static uint8 soft_iic_read_data (soft_iic_info_struct *soft_iic_obj, uint8 ack)
|
||||
{
|
||||
uint8 data = 0x00;
|
||||
uint8 temp = 8;
|
||||
soft_iic_gpio_low_scl(); // SCL 低电平
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
soft_iic_gpio_high_sda(); // SDA 高电平 释放 SDA
|
||||
#if SOFT_IIC_SDA_IO_SWITCH
|
||||
gpio_set_dir(soft_iic_obj->sda_pin, GPI, GPI_FLOATING_IN);
|
||||
#endif
|
||||
|
||||
while(temp --)
|
||||
{
|
||||
soft_iic_gpio_low_scl(); // SCL 拉低
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
soft_iic_gpio_high_scl(); // SCL 拉高
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
data = ((data << 1) | gpio_get_level(soft_iic_obj->sda_pin));
|
||||
}
|
||||
soft_iic_gpio_low_scl(); // SCL 低电平
|
||||
#if SOFT_IIC_SDA_IO_SWITCH
|
||||
gpio_set_dir(soft_iic_obj->sda_pin, GPO, GPO_OPEN_DTAIN);
|
||||
#endif
|
||||
soft_iic_delay(soft_iic_obj->delay);
|
||||
soft_iic_send_ack(soft_iic_obj, ack);
|
||||
return data;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口写 8bit 数据
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 data 要写入的数据
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_write_8bit_register(soft_iic_obj, 0x01);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_write_8bit (soft_iic_info_struct *soft_iic_obj, const uint8 data)
|
||||
{
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
soft_iic_send_data(soft_iic_obj, data);
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口写 8bit 数组
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 参数说明 len 缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_write_8bit_array(soft_iic_obj, data, 6);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_write_8bit_array (soft_iic_info_struct *soft_iic_obj, const uint8 *data, uint32 len)
|
||||
{
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
while(len --)
|
||||
{
|
||||
soft_iic_send_data(soft_iic_obj, *data ++);
|
||||
}
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口器写 16bit 数据
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 data 要写入的数据
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_write_16bit(soft_iic_obj, 0x0101);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_write_16bit (soft_iic_info_struct *soft_iic_obj, const uint16 data)
|
||||
{
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)((data & 0xFF00) >> 8));
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)(data & 0x00FF));
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口写 16bit 数组
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 参数说明 len 缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_write_16bit_array(soft_iic_obj, data, 6);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_write_16bit_array (soft_iic_info_struct *soft_iic_obj, const uint16 *data, uint32 len)
|
||||
{
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
while(len --)
|
||||
{
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)((*data & 0xFF00) >> 8));
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)(*data ++ & 0x00FF));
|
||||
}
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口向传感器寄存器写 8bit 数据
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 register_name 传感器的寄存器地址
|
||||
// 参数说明 data 要写入的数据
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_write_8bit_register(soft_iic_obj, 0x01, 0x01);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_write_8bit_register (soft_iic_info_struct *soft_iic_obj, const uint8 register_name, const uint8 data)
|
||||
{
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
soft_iic_send_data(soft_iic_obj, register_name);
|
||||
soft_iic_send_data(soft_iic_obj, data);
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口向传感器寄存器写 8bit 数组
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 register_name 传感器的寄存器地址
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 参数说明 len 缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_write_8bit_registers(soft_iic_obj, 0x01, data, 6);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_write_8bit_registers (soft_iic_info_struct *soft_iic_obj, const uint8 register_name, const uint8 *data, uint32 len)
|
||||
{
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
soft_iic_send_data(soft_iic_obj, register_name);
|
||||
while(len --)
|
||||
{
|
||||
soft_iic_send_data(soft_iic_obj, *data ++);
|
||||
}
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口向传感器寄存器写 16bit 数据
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 register_name 传感器的寄存器地址
|
||||
// 参数说明 data 要写入的数据
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_write_16bit_register(soft_iic_obj, 0x0101, 0x0101);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_write_16bit_register (soft_iic_info_struct *soft_iic_obj, const uint16 register_name, const uint16 data)
|
||||
{
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)((register_name & 0xFF00) >> 8));
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)(register_name & 0x00FF));
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)((data & 0xFF00) >> 8));
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)(data & 0x00FF));
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口向传感器寄存器写 16bit 数组
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 register_name 传感器的寄存器地址
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 参数说明 len 缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_write_16bit_registers(soft_iic_obj, 0x0101, data, 6);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_write_16bit_registers (soft_iic_info_struct *soft_iic_obj, const uint16 register_name, const uint16 *data, uint32 len)
|
||||
{
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)((register_name & 0xFF00) >> 8));
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)(register_name & 0x00FF));
|
||||
while(len--)
|
||||
{
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)((*data & 0xFF00) >> 8));
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)(*data ++ & 0x00FF));
|
||||
}
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口读取 8bit 数据
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 返回参数 uint8 返回读取的 8bit 数据
|
||||
// 使用示例 soft_iic_read_8bit(soft_iic_obj);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 soft_iic_read_8bit (soft_iic_info_struct *soft_iic_obj)
|
||||
{
|
||||
uint8 temp = 0;
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
||||
temp = soft_iic_read_data(soft_iic_obj, 1);
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
return temp;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口从传感器寄存器读取 8bit 数组
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 register_name 传感器的寄存器地址
|
||||
// 参数说明 *data 要读取的数据的缓冲区指针
|
||||
// 参数说明 len 要读取的数据长度
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_read_8bit_array(soft_iic_obj, data, 8);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_read_8bit_array (soft_iic_info_struct *soft_iic_obj, uint8 *data, uint32 len)
|
||||
{
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
||||
while(len --)
|
||||
{
|
||||
*data ++ = soft_iic_read_data(soft_iic_obj, len == 0);
|
||||
}
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口读取 16bit 数据
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 register_name 传感器的寄存器地址
|
||||
// 返回参数 uint16 返回读取的 16bit 数据
|
||||
// 使用示例 soft_iic_read_16bit(soft_iic_obj);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint16 soft_iic_read_16bit (soft_iic_info_struct *soft_iic_obj)
|
||||
{
|
||||
uint16 temp = 0;
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
||||
temp = soft_iic_read_data(soft_iic_obj, 0);
|
||||
temp = ((temp << 8)| soft_iic_read_data(soft_iic_obj, 1));
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
return temp;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口读取 16bit 数组
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 *data 要读取的数据的缓冲区指针
|
||||
// 参数说明 len 要读取的数据长度
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_read_16bit_array(soft_iic_obj, data, 8);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_read_16bit_array (soft_iic_info_struct *soft_iic_obj, uint16 *data, uint32 len)
|
||||
{
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
||||
while(len --)
|
||||
{
|
||||
*data = soft_iic_read_data(soft_iic_obj, 0);
|
||||
*data = ((*data << 8)| soft_iic_read_data(soft_iic_obj, len == 0));
|
||||
data ++;
|
||||
}
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口从传感器寄存器读取 8bit 数据
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 register_name 传感器的寄存器地址
|
||||
// 返回参数 uint8 返回读取的 8bit 数据
|
||||
// 使用示例 soft_iic_read_8bit_register(soft_iic_obj, 0x01);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 soft_iic_read_8bit_register (soft_iic_info_struct *soft_iic_obj, const uint8 register_name)
|
||||
{
|
||||
uint8 temp = 0;
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
soft_iic_send_data(soft_iic_obj, register_name);
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
||||
temp = soft_iic_read_data(soft_iic_obj, 1);
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
return temp;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口从传感器寄存器读取 8bit 数组
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 register_name 传感器的寄存器地址
|
||||
// 参数说明 *data 要读取的数据的缓冲区指针
|
||||
// 参数说明 len 要读取的数据长度
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_read_8bit_registers(soft_iic_obj, 0x01, data, 8);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_read_8bit_registers (soft_iic_info_struct *soft_iic_obj, const uint8 register_name, uint8 *data, uint32 len)
|
||||
{
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
soft_iic_send_data(soft_iic_obj, register_name);
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
||||
while(len --)
|
||||
{
|
||||
*data ++ = soft_iic_read_data(soft_iic_obj, len == 0);
|
||||
}
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口从传感器寄存器读取 16bit 数据
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 register_name 传感器的寄存器地址
|
||||
// 返回参数 uint16 返回读取的 16bit 数据
|
||||
// 使用示例 soft_iic_read_16bit_register(soft_iic_obj, 0x0101);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint16 soft_iic_read_16bit_register (soft_iic_info_struct *soft_iic_obj, const uint16 register_name)
|
||||
{
|
||||
uint16 temp = 0;
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)((register_name & 0xFF00) >> 8));
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)(register_name & 0x00FF));
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
||||
temp = soft_iic_read_data(soft_iic_obj, 0);
|
||||
temp = ((temp << 8)| soft_iic_read_data(soft_iic_obj, 1));
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
return temp;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口从传感器寄存器读取 16bit 数组
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 register_name 传感器的寄存器地址
|
||||
// 参数说明 *data 要读取的数据的缓冲区指针
|
||||
// 参数说明 len 要读取的数据长度
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_read_16bit_registers(soft_iic_obj, 0x0101, data, 8);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_read_16bit_registers (soft_iic_info_struct *soft_iic_obj, const uint16 register_name, uint16 *data, uint32 len)
|
||||
{
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)((register_name & 0xFF00) >> 8));
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)(register_name & 0x00FF));
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
||||
while(len --)
|
||||
{
|
||||
*data = soft_iic_read_data(soft_iic_obj, 0);
|
||||
*data = ((*data << 8)| soft_iic_read_data(soft_iic_obj, len == 0));
|
||||
data ++;
|
||||
}
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口传输 8bit 数组 先写后读取
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 *write_data 发送数据存放缓冲区
|
||||
// 参数说明 write_len 发送缓冲区长度
|
||||
// 参数说明 *read_data 读取数据存放缓冲区
|
||||
// 参数说明 read_len 读取缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 iic_transfer_8bit_array(IIC_1, addr, data, 64, data, 64);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_transfer_8bit_array (soft_iic_info_struct *soft_iic_obj, const uint8 *write_data, uint32 write_len, uint8 *read_data, uint32 read_len)
|
||||
{
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
while(write_len --)
|
||||
{
|
||||
soft_iic_send_data(soft_iic_obj, *write_data ++);
|
||||
}
|
||||
if(read_len)
|
||||
{
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
||||
while(read_len --)
|
||||
{
|
||||
*read_data ++ = soft_iic_read_data(soft_iic_obj, 0 == read_len);
|
||||
}
|
||||
}
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口传输 16bit 数组 先写后读取
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 *write_data 发送数据存放缓冲区
|
||||
// 参数说明 write_len 发送缓冲区长度
|
||||
// 参数说明 *read_data 读取数据存放缓冲区
|
||||
// 参数说明 read_len 读取缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 iic_transfer_16bit_array(IIC_1, addr, data, 64, data, 64);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_transfer_16bit_array (soft_iic_info_struct *soft_iic_obj, const uint16 *write_data, uint32 write_len, uint16 *read_data, uint32 read_len)
|
||||
{
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
while(write_len--)
|
||||
{
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)((*write_data & 0xFF00) >> 8));
|
||||
soft_iic_send_data(soft_iic_obj, (uint8)(*write_data ++ & 0x00FF));
|
||||
}
|
||||
if(read_len)
|
||||
{
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
||||
while(read_len --)
|
||||
{
|
||||
*read_data = soft_iic_read_data(soft_iic_obj, 0);
|
||||
*read_data = ((*read_data << 8)| soft_iic_read_data(soft_iic_obj, 0 == read_len));
|
||||
read_data ++;
|
||||
}
|
||||
}
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口 SCCB 模式向传感器寄存器写 8bit 数据
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 register_name 传感器的寄存器地址
|
||||
// 参数说明 data 要写入的数据
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_sccb_write_register(soft_iic_obj, 0x01, 0x01);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_sccb_write_register (soft_iic_info_struct *soft_iic_obj, const uint8 register_name, uint8 data)
|
||||
{
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
soft_iic_send_data(soft_iic_obj, register_name);
|
||||
soft_iic_send_data(soft_iic_obj, data);
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口 SCCB 模式从传感器寄存器读取 8bit 数据
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息 可以参照 zf_driver_soft_iic.h 里的格式看看
|
||||
// 参数说明 register_name 传感器的寄存器地址
|
||||
// 返回参数 uint8 返回读取的 8bit 数据
|
||||
// 使用示例 soft_iic_sccb_read_register(soft_iic_obj, 0x01);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 soft_iic_sccb_read_register (soft_iic_info_struct *soft_iic_obj, const uint8 register_name)
|
||||
{
|
||||
uint8 temp = 0;
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
||||
soft_iic_send_data(soft_iic_obj, register_name);
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
|
||||
soft_iic_start(soft_iic_obj);
|
||||
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
||||
temp = soft_iic_read_data(soft_iic_obj, 1);
|
||||
soft_iic_stop(soft_iic_obj);
|
||||
return temp;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 IIC 接口初始化 默认 MASTER 模式 不提供 SLAVE 模式
|
||||
// 参数说明 *soft_iic_obj 软件 IIC 指定信息存放结构体的指针
|
||||
// 参数说明 addr 软件 IIC 地址 这里需要注意 标准七位地址 最高位忽略 写入时请务必确认无误
|
||||
// 参数说明 delay 软件 IIC 延时 就是时钟高电平时间 越短 IIC 速率越高
|
||||
// 参数说明 scl_pin 软件 IIC 时钟引脚 参照 zf_driver_gpio.h 内 gpio_pin_enum 枚举体定义
|
||||
// 参数说明 sda_pin 软件 IIC 数据引脚 参照 zf_driver_gpio.h 内 gpio_pin_enum 枚举体定义
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_iic_init(&soft_iic_obj, addr, 100, B6, B7);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_iic_init (soft_iic_info_struct *soft_iic_obj, uint8 addr, uint32 delay, gpio_pin_enum scl_pin, gpio_pin_enum sda_pin)
|
||||
{
|
||||
zf_assert(scl_pin != sda_pin); // 醒醒! scl_pin 与 sda_pin 怎么能填同一个引脚?
|
||||
soft_iic_obj->scl_pin = scl_pin;
|
||||
soft_iic_obj->sda_pin = sda_pin;
|
||||
soft_iic_obj->addr = addr;
|
||||
soft_iic_obj->delay = delay;
|
||||
soft_iic_obj->iic_scl = (void *)get_port(scl_pin);
|
||||
soft_iic_obj->iic_sda = (void *)get_port(sda_pin);
|
||||
gpio_init(scl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 提取对应IO索引 AF功能编码
|
||||
gpio_init(sda_pin, GPO, GPIO_HIGH, GPO_OPEN_DTAIN); // 提取对应IO索引 AF功能编码
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_soft_iic
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#ifndef _zf_driver_soft_iic_h_
|
||||
#define _zf_driver_soft_iic_h_
|
||||
|
||||
#include "zf_common_typedef.h"
|
||||
#include "zf_driver_gpio.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32 scl_pin; // 用于记录对应的引脚编号
|
||||
uint32 sda_pin; // 用于记录对应的引脚编号
|
||||
uint8 addr; // 器件地址 七位地址模式
|
||||
uint32 delay; // 模拟 IIC 软延时时长 0:1370KHz 10:1020KHz 20:757KHz 30: 633KHz 40: 532Khz 50: 448KHz 60: 395KHz 70: 359KHz 80: 324KHz 100: 268KHz 1000:32KHz
|
||||
void *iic_scl; // 记录 SCL 端口地址
|
||||
void *iic_sda; // 记录 SDA 端口地址
|
||||
}soft_iic_info_struct;
|
||||
|
||||
//==================================================SOFT_IIC 基础函数====================================================
|
||||
void soft_iic_write_8bit (soft_iic_info_struct *soft_iic_obj, const uint8 data);
|
||||
void soft_iic_write_8bit_array (soft_iic_info_struct *soft_iic_obj, const uint8 *data, uint32 len);
|
||||
|
||||
void soft_iic_write_16bit (soft_iic_info_struct *soft_iic_obj, const uint16 data);
|
||||
void soft_iic_write_16bit_array (soft_iic_info_struct *soft_iic_obj, const uint16 *data, uint32 len);
|
||||
|
||||
void soft_iic_write_8bit_register (soft_iic_info_struct *soft_iic_obj, const uint8 register_name, const uint8 data);
|
||||
void soft_iic_write_8bit_registers (soft_iic_info_struct *soft_iic_obj, const uint8 register_name, const uint8 *data, uint32 len);
|
||||
|
||||
void soft_iic_write_16bit_register (soft_iic_info_struct *soft_iic_obj, const uint16 register_name, const uint16 data);
|
||||
void soft_iic_write_16bit_registers (soft_iic_info_struct *soft_iic_obj, const uint16 register_name, const uint16 *data, uint32 len);
|
||||
|
||||
uint8 soft_iic_read_8bit (soft_iic_info_struct *soft_iic_obj);
|
||||
void soft_iic_read_8bit_array (soft_iic_info_struct *soft_iic_obj, uint8 *data, uint32 len);
|
||||
|
||||
uint16 soft_iic_read_16bit (soft_iic_info_struct *soft_iic_obj);
|
||||
void soft_iic_read_16bit_array (soft_iic_info_struct *soft_iic_obj, uint16 *data, uint32 len);
|
||||
|
||||
uint8 soft_iic_read_8bit_register (soft_iic_info_struct *soft_iic_obj, const uint8 register_name);
|
||||
void soft_iic_read_8bit_registers (soft_iic_info_struct *soft_iic_obj, const uint8 register_name, uint8 *data, uint32 len);
|
||||
|
||||
uint16 soft_iic_read_16bit_register (soft_iic_info_struct *soft_iic_obj, const uint16 register_name);
|
||||
void soft_iic_read_16bit_registers (soft_iic_info_struct *soft_iic_obj, const uint16 register_name, uint16 *data, uint32 len);
|
||||
|
||||
void soft_iic_transfer_8bit_array (soft_iic_info_struct *soft_iic_obj, const uint8 *write_data, uint32 write_len, uint8 *read_data, uint32 read_len);
|
||||
void soft_iic_transfer_16bit_array (soft_iic_info_struct *soft_iic_obj, const uint16 *write_data, uint32 write_len, uint16 *read_data, uint32 read_len);
|
||||
|
||||
void soft_iic_sccb_write_register (soft_iic_info_struct *soft_iic_obj, const uint8 register_name, uint8 data);
|
||||
uint8 soft_iic_sccb_read_register (soft_iic_info_struct *soft_iic_obj, const uint8 register_name);
|
||||
|
||||
void soft_iic_init (soft_iic_info_struct *soft_iic_obj, uint8 addr, uint32 delay, gpio_pin_enum scl_pin, gpio_pin_enum sda_pin);
|
||||
//==================================================SOFT_IIC 基础函数====================================================
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,571 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_soft_spi
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#include "zf_common_debug.h"
|
||||
#include "zf_driver_soft_spi.h"
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 SPI 延时
|
||||
// 参数说明 void
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_spi_delay(1);
|
||||
// 备注信息 内部调用
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
#define soft_spi_delay(x) for(uint32 i = x; i --; )
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 SPI 8bit 数据读写
|
||||
// 参数说明 *soft_spi_obj 软件 SPI 指定信息存放结构体的指针
|
||||
// 参数说明 data 数据
|
||||
// 返回参数 uint8 读取的数据
|
||||
// 使用示例 soft_spi_8bit_data_handler(soft_spi_obj, 1);
|
||||
// 备注信息 内部调用
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
static uint8 soft_spi_8bit_data_handler (soft_spi_info_struct *soft_spi_obj, const uint8 data)
|
||||
{
|
||||
uint8 temp = 0;
|
||||
uint8 write_data = data;
|
||||
uint8 read_data = 0;
|
||||
|
||||
if(soft_spi_obj->config.use_cs)
|
||||
{
|
||||
gpio_low(soft_spi_obj->cs_pin);
|
||||
}
|
||||
|
||||
if(0 == soft_spi_obj->config.mode || 1 == soft_spi_obj->config.mode) // CPOL = 0 SCK 空闲低电平
|
||||
{
|
||||
gpio_low(soft_spi_obj->sck_pin);
|
||||
}
|
||||
else // CPOL = 1 SCK 空闲高电平
|
||||
{
|
||||
gpio_high(soft_spi_obj->sck_pin);
|
||||
}
|
||||
|
||||
if(0 == soft_spi_obj->config.mode % 2) // CPHA = 0 第一个边沿采样
|
||||
{
|
||||
for(temp = 8; temp > 0; temp --)
|
||||
{
|
||||
if(0x80 & write_data)
|
||||
{
|
||||
gpio_high(soft_spi_obj->mosi_pin);
|
||||
}
|
||||
else
|
||||
{
|
||||
gpio_low(soft_spi_obj->mosi_pin);
|
||||
}
|
||||
soft_spi_delay(soft_spi_obj->delay);
|
||||
gpio_toggle_level(soft_spi_obj->sck_pin);
|
||||
write_data = write_data << 1;
|
||||
read_data = read_data << 1;
|
||||
if(soft_spi_obj->config.use_miso)
|
||||
{
|
||||
read_data |= gpio_get_level(soft_spi_obj->miso_pin);
|
||||
}
|
||||
soft_spi_delay(soft_spi_obj->delay);
|
||||
gpio_toggle_level(soft_spi_obj->sck_pin);
|
||||
}
|
||||
}
|
||||
else // CPHA = 1 第二个边沿采样
|
||||
{
|
||||
for(temp = 8; 0 < temp; temp --)
|
||||
{
|
||||
gpio_toggle_level(soft_spi_obj->sck_pin);
|
||||
if(0x80 & write_data)
|
||||
{
|
||||
gpio_high(soft_spi_obj->mosi_pin);
|
||||
}
|
||||
else
|
||||
{
|
||||
gpio_low(soft_spi_obj->mosi_pin);
|
||||
}
|
||||
soft_spi_delay(soft_spi_obj->delay);
|
||||
gpio_toggle_level(soft_spi_obj->sck_pin);
|
||||
write_data = write_data << 1;
|
||||
read_data = read_data << 1;
|
||||
if(soft_spi_obj->config.use_miso)
|
||||
{
|
||||
read_data |= gpio_get_level(soft_spi_obj->miso_pin);
|
||||
}
|
||||
soft_spi_delay(soft_spi_obj->delay);
|
||||
}
|
||||
}
|
||||
|
||||
if(soft_spi_obj->config.use_cs)
|
||||
{
|
||||
gpio_high(soft_spi_obj->cs_pin);
|
||||
}
|
||||
return read_data;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 SPI 16bit 数据读写
|
||||
// 参数说明 *soft_spi_obj 软件 SPI 指定信息存放结构体的指针
|
||||
// 参数说明 data 数据
|
||||
// 返回参数 uint16 读取的数据
|
||||
// 使用示例 soft_spi_16bit_data_handler(soft_spi_obj, 1);
|
||||
// 备注信息 内部调用
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
static uint16 soft_spi_16bit_data_handler (soft_spi_info_struct *soft_spi_obj, const uint16 data)
|
||||
{
|
||||
uint8 temp = 0;
|
||||
uint16 write_data = data;
|
||||
uint16 read_data = 0;
|
||||
|
||||
if(soft_spi_obj->config.use_cs)
|
||||
{
|
||||
gpio_low(soft_spi_obj->cs_pin);
|
||||
}
|
||||
|
||||
if(0 == soft_spi_obj->config.mode || 1 == soft_spi_obj->config.mode) // CPOL = 0 SCK 空闲低电平
|
||||
{
|
||||
gpio_low(soft_spi_obj->sck_pin);
|
||||
}
|
||||
else // CPOL = 1 SCK 空闲高电平
|
||||
{
|
||||
gpio_high(soft_spi_obj->sck_pin);
|
||||
}
|
||||
|
||||
if(0 == soft_spi_obj->config.mode % 2) // CPHA = 0 第一个边沿采样
|
||||
{
|
||||
for(temp = 16; 0 < temp; temp --)
|
||||
{
|
||||
if(0x8000 & write_data)
|
||||
{
|
||||
gpio_high(soft_spi_obj->mosi_pin);
|
||||
}
|
||||
else
|
||||
{
|
||||
gpio_low(soft_spi_obj->mosi_pin);
|
||||
}
|
||||
soft_spi_delay(soft_spi_obj->delay);
|
||||
gpio_toggle_level(soft_spi_obj->sck_pin);
|
||||
write_data = write_data << 1;
|
||||
read_data = read_data << 1;
|
||||
if(soft_spi_obj->config.use_miso)
|
||||
{
|
||||
read_data |= gpio_get_level(soft_spi_obj->miso_pin);
|
||||
}
|
||||
soft_spi_delay(soft_spi_obj->delay);
|
||||
gpio_toggle_level(soft_spi_obj->sck_pin);
|
||||
}
|
||||
}
|
||||
else // CPHA = 1 第二个边沿采样
|
||||
{
|
||||
for(temp = 16; 0 < temp; temp --)
|
||||
{
|
||||
gpio_toggle_level(soft_spi_obj->sck_pin);
|
||||
if(write_data & 0x8000)
|
||||
{
|
||||
gpio_high(soft_spi_obj->mosi_pin);
|
||||
}
|
||||
else
|
||||
{
|
||||
gpio_low(soft_spi_obj->mosi_pin);
|
||||
}
|
||||
soft_spi_delay(soft_spi_obj->delay);
|
||||
gpio_toggle_level(soft_spi_obj->sck_pin);
|
||||
write_data = write_data << 1;
|
||||
read_data = read_data << 1;
|
||||
if(soft_spi_obj->config.use_miso)
|
||||
{
|
||||
read_data |= gpio_get_level(soft_spi_obj->miso_pin);
|
||||
}
|
||||
soft_spi_delay(soft_spi_obj->delay);
|
||||
}
|
||||
}
|
||||
|
||||
if(soft_spi_obj->config.use_cs)
|
||||
{
|
||||
gpio_high(soft_spi_obj->cs_pin);
|
||||
}
|
||||
return read_data;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 SPI 接口写 8bit 数据
|
||||
// 参数说明 *soft_spi_obj 软件 SPI 指定信息存放结构体的指针
|
||||
// 参数说明 data 发送的数据
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_spi_write_8bit(&soft_spi_obj, 1);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_spi_write_8bit (soft_spi_info_struct *soft_spi_obj, const uint8 data)
|
||||
{
|
||||
soft_spi_8bit_data_handler(soft_spi_obj, data);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 SPI 接口写 8bit 数组
|
||||
// 参数说明 *soft_spi_obj 软件 SPI 指定信息存放结构体的指针
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 参数说明 len 缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_spi_write_8bit_array(&soft_spi_obj, buf, 16);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_spi_write_8bit_array (soft_spi_info_struct *soft_spi_obj, const uint8 *data, uint32 len)
|
||||
{
|
||||
while(len --)
|
||||
{
|
||||
soft_spi_8bit_data_handler(soft_spi_obj, *data ++);
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 SPI 接口写 16bit 数据
|
||||
// 参数说明 *soft_spi_obj 软件 SPI 指定信息存放结构体的指针
|
||||
// 参数说明 data 发送的数据
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_spi_write_16bit(&soft_spi_obj, 1);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_spi_write_16bit (soft_spi_info_struct *soft_spi_obj, uint16 data)
|
||||
{
|
||||
soft_spi_16bit_data_handler(soft_spi_obj, data);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 SPI 接口写 16bit 数组
|
||||
// 参数说明 *soft_spi_obj 软件 SPI 指定信息存放结构体的指针
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 参数说明 len 缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_spi_write_16bit_array(&soft_spi_obj, buf, 16);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_spi_write_16bit_array (soft_spi_info_struct *soft_spi_obj, const uint16 *data, uint32 len)
|
||||
{
|
||||
while(len --)
|
||||
{
|
||||
soft_spi_16bit_data_handler(soft_spi_obj, *data ++);
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 SPI 接口向传感器的寄存器写 8bit 数据
|
||||
// 参数说明 *soft_spi_obj 软件 SPI 指定信息存放结构体的指针
|
||||
// 参数说明 register_name 寄存器地址
|
||||
// 参数说明 data 发送的数据
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_spi_write_8bit_register(&soft_spi_obj, 1, 1);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_spi_write_8bit_register (soft_spi_info_struct *soft_spi_obj, const uint8 register_name, const uint8 data)
|
||||
{
|
||||
soft_spi_8bit_data_handler(soft_spi_obj, register_name);
|
||||
soft_spi_8bit_data_handler(soft_spi_obj, data);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 SPI 接口向传感器的寄存器写 8bit 数组
|
||||
// 参数说明 *soft_spi_obj 软件 SPI 指定信息存放结构体的指针
|
||||
// 参数说明 register_name 寄存器地址
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 参数说明 len 缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_spi_write_8bit_registers(&soft_spi_obj, 1, buf, 16);
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_spi_write_8bit_registers (soft_spi_info_struct *soft_spi_obj, const uint8 register_name, const uint8 *data, uint32 len)
|
||||
{
|
||||
soft_spi_8bit_data_handler(soft_spi_obj, register_name);
|
||||
while(len --)
|
||||
{
|
||||
soft_spi_8bit_data_handler(soft_spi_obj, *data ++);
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 SPI 接口向传感器的寄存器写 16bit 数据
|
||||
// 参数说明 *soft_spi_obj 软件 SPI 指定信息存放结构体的指针
|
||||
// 参数说明 register_name 寄存器地址
|
||||
// 参数说明 data 发送的数据
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_spi_write_16bit_register(&soft_spi_obj, 1, 1);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_spi_write_16bit_register (soft_spi_info_struct *soft_spi_obj, const uint16 register_name, uint16 data)
|
||||
{
|
||||
soft_spi_16bit_data_handler(soft_spi_obj, register_name);
|
||||
soft_spi_16bit_data_handler(soft_spi_obj, data);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 SPI 接口向传感器的寄存器写 16bit 数组
|
||||
// 参数说明 *soft_spi_obj 软件 SPI 指定信息存放结构体的指针
|
||||
// 参数说明 register_name 寄存器地址
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 参数说明 len 缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_spi_write_16bit_registers(&soft_spi_obj, 1, buf, 16);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_spi_write_16bit_registers (soft_spi_info_struct *soft_spi_obj, const uint16 register_name, const uint16 *data, uint32 len)
|
||||
{
|
||||
soft_spi_16bit_data_handler(soft_spi_obj, register_name);
|
||||
while(len --)
|
||||
{
|
||||
soft_spi_16bit_data_handler(soft_spi_obj, *data ++);
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 SPI 接口读 8bit 数据
|
||||
// 参数说明 *soft_spi_obj 软件 SPI 指定信息存放结构体的指针
|
||||
// 参数说明 data 发送的数据
|
||||
// 返回参数 uint8 返回读取的 8bit 数据
|
||||
// 使用示例 soft_spi_read_8bit(&soft_spi_obj);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 soft_spi_read_8bit (soft_spi_info_struct *soft_spi_obj)
|
||||
{
|
||||
return soft_spi_8bit_data_handler(soft_spi_obj, 0);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 SPI 接口读 8bit 数组
|
||||
// 参数说明 *soft_spi_obj 软件 SPI 指定信息存放结构体的指针
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 参数说明 len 缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_spi_read_8bit_array(&soft_spi_obj, buf, 16);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_spi_read_8bit_array (soft_spi_info_struct *soft_spi_obj, uint8 *data, uint32 len)
|
||||
{
|
||||
while(len --)
|
||||
{
|
||||
*data ++ = soft_spi_8bit_data_handler(soft_spi_obj, 0);
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 SPI 接口读 16bit 数据
|
||||
// 参数说明 *soft_spi_obj 软件 SPI 指定信息存放结构体的指针
|
||||
// 参数说明 data 发送的数据
|
||||
// 返回参数 uint16 返回读取的 16bit 数据
|
||||
// 使用示例 soft_spi_read_16bit(&soft_spi_obj);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint16 soft_spi_read_16bit (soft_spi_info_struct *soft_spi_obj)
|
||||
{
|
||||
return soft_spi_16bit_data_handler(soft_spi_obj, 0);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 SPI 接口读 16bit 数组
|
||||
// 参数说明 *soft_spi_obj 软件 SPI 指定信息存放结构体的指针
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 参数说明 len 缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_spi_read_16bit_array(&soft_spi_obj, buf, 16);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_spi_read_16bit_array (soft_spi_info_struct *soft_spi_obj, uint16 *data, uint32 len)
|
||||
{
|
||||
while(len --)
|
||||
{
|
||||
*data ++ = soft_spi_16bit_data_handler(soft_spi_obj, 0);
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 SPI 接口从传感器的寄存器读 8bit 数据
|
||||
// 参数说明 *soft_spi_obj 软件 SPI 指定信息存放结构体的指针
|
||||
// 参数说明 register_name 寄存器地址
|
||||
// 参数说明 data 发送的数据
|
||||
// 返回参数 uint8 返回读取的 8bit 数据
|
||||
// 使用示例 soft_spi_read_8bit_register(&soft_spi_obj, 0x01, 0x01);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 soft_spi_read_8bit_register (soft_spi_info_struct *soft_spi_obj, const uint8 register_name)
|
||||
{
|
||||
soft_spi_8bit_data_handler(soft_spi_obj, register_name);
|
||||
return soft_spi_8bit_data_handler(soft_spi_obj, 0);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 SPI 接口从传感器的寄存器读 8bit 数组
|
||||
// 参数说明 *soft_spi_obj 软件 SPI 指定信息存放结构体的指针
|
||||
// 参数说明 register_name 寄存器地址
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 参数说明 len 缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_spi_read_8bit_registers(&soft_spi_obj, 0x01, buf, 16);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_spi_read_8bit_registers (soft_spi_info_struct *soft_spi_obj, const uint8 register_name, uint8 *data, uint32 len)
|
||||
{
|
||||
soft_spi_8bit_data_handler(soft_spi_obj, register_name);
|
||||
while(len --)
|
||||
{
|
||||
*data ++ = soft_spi_8bit_data_handler(soft_spi_obj, 0);
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 SPI 接口从传感器的寄存器读 16bit 数据
|
||||
// 参数说明 *soft_spi_obj 软件 SPI 指定信息存放结构体的指针
|
||||
// 参数说明 register_name 寄存器地址
|
||||
// 参数说明 data 发送的数据
|
||||
// 返回参数 uint16 返回读取的 16bit 数据
|
||||
// 使用示例 soft_spi_read_16bit_register(&soft_spi_obj, 0x0101);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint16 soft_spi_read_16bit_register (soft_spi_info_struct *soft_spi_obj, const uint16 register_name)
|
||||
{
|
||||
soft_spi_16bit_data_handler(soft_spi_obj, register_name);
|
||||
return soft_spi_16bit_data_handler(soft_spi_obj, 0);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 SPI 接口从传感器的寄存器读 16bit 数组
|
||||
// 参数说明 *soft_spi_obj 软件 SPI 指定信息存放结构体的指针
|
||||
// 参数说明 register_name 寄存器地址
|
||||
// 参数说明 *data 数据存放缓冲区
|
||||
// 参数说明 len 缓冲区长度
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_spi_read_16bit_registers(&soft_spi_obj, 0x0101, buf, 16);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_spi_read_16bit_registers (soft_spi_info_struct *soft_spi_obj, const uint16 register_name, uint16 *data, uint32 len)
|
||||
{
|
||||
soft_spi_16bit_data_handler(soft_spi_obj, register_name);
|
||||
while(len --)
|
||||
{
|
||||
*data ++ = soft_spi_16bit_data_handler(soft_spi_obj, 0);
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 SPI 8bit 数据传输 发送与接收数据是同时进行的
|
||||
// 参数说明 *soft_spi_obj 软件 SPI 指定信息存放结构体的指针
|
||||
// 参数说明 write_buffer 发送的数据缓冲区地址
|
||||
// 参数说明 read_buffer 发送数据时接收到的数据的存储地址(不需要接收则传 NULL)
|
||||
// 参数说明 len 发送的字节数
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_spi_8bit_transfer(&soft_spi_obj, buf, buf, 1);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_spi_8bit_transfer (soft_spi_info_struct *soft_spi_obj, const uint8 *write_buffer, uint8 *read_buffer, uint32 len)
|
||||
{
|
||||
while(len --)
|
||||
{
|
||||
*read_buffer = soft_spi_8bit_data_handler(soft_spi_obj, *write_buffer);
|
||||
write_buffer ++;
|
||||
read_buffer ++;
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 SPI 16bit 数据传输 发送与接收数据是同时进行的
|
||||
// 参数说明 *soft_spi_obj 软件 SPI 指定信息存放结构体的指针
|
||||
// 参数说明 write_buffer 发送的数据缓冲区地址
|
||||
// 参数说明 read_buffer 发送数据时接收到的数据的存储地址(不需要接收则传 NULL)
|
||||
// 参数说明 len 发送的字节数
|
||||
// 返回参数 void
|
||||
// 使用示例 soft_spi_16bit_transfer(&soft_spi_obj, buf, buf, 1);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_spi_16bit_transfer (soft_spi_info_struct *soft_spi_obj, const uint16 *write_buffer, uint16 *read_buffer, uint32 len)
|
||||
{
|
||||
while(len --)
|
||||
{
|
||||
*read_buffer = soft_spi_16bit_data_handler(soft_spi_obj, *write_buffer);
|
||||
write_buffer ++;
|
||||
read_buffer ++;
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 软件 SPI 接口初始化
|
||||
// 参数说明 *soft_spi_obj 软件 SPI 指定信息存放结构体的指针
|
||||
// 参数说明 mode SPI 模式 参照 zf_driver_spi.h 内 spi_mode_enum 枚举体定义
|
||||
// 参数说明 delay 软件 SPI 延时 就是时钟高电平时间 越短 SPI 速率越高
|
||||
// 参数说明 sck_pin 选择 SCK 引脚 参照 zf_driver_gpio.h 内 gpio_pin_enum 枚举体定义
|
||||
// 参数说明 mosi_pin 选择 MOSI 引脚 参照 zf_driver_gpio.h 内 gpio_pin_enum 枚举体定义
|
||||
// 参数说明 miso_pin 选择 MISO 引脚 如果不需要这个引脚 就填 SOFT_SPI_PIN_NULL
|
||||
// 参数说明 cs_pin 选择 CS 引脚 如果不需要这个引脚 就填 SOFT_SPI_PIN_NULL
|
||||
// 返回参数 void
|
||||
// 使用示例 spi_init(SPI_1, 0, 1*1000*1000, A5, A7, A6, A4);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void soft_spi_init (soft_spi_info_struct *soft_spi_obj, uint8 mode, uint32 delay, gpio_pin_enum sck_pin, gpio_pin_enum mosi_pin, uint32 miso_pin, uint32 cs_pin)
|
||||
{
|
||||
zf_assert(sck_pin != mosi_pin); // sck_pin 与 mosi_pin 怎么能填同一个引脚?
|
||||
zf_assert(sck_pin != miso_pin); // sck_pin 与 miso_pin 怎么能填同一个引脚?
|
||||
zf_assert(sck_pin != cs_pin); // sck_pin 与 cs_pin 怎么能填同一个引脚?
|
||||
zf_assert(mosi_pin != miso_pin); // mosi_pin 与 miso_pin 怎么能填同一个引脚?
|
||||
zf_assert(mosi_pin != cs_pin); // mosi_pin 与 cs_pin 怎么能填同一个引脚?
|
||||
zf_assert((miso_pin != cs_pin) || (cs_pin == SOFT_SPI_PIN_NULL)); // miso_pin 与 cs_pin 怎么能填同一个引脚?
|
||||
|
||||
zf_assert(4 > mode); // 参照 zf_driver_spi.h 内 spi_mode_enum 枚举体定义
|
||||
|
||||
soft_spi_obj->config.mode = mode;
|
||||
soft_spi_obj->delay = delay;
|
||||
|
||||
soft_spi_obj->sck_pin = sck_pin;
|
||||
soft_spi_obj->mosi_pin = mosi_pin;
|
||||
if(0 == mode || 1 == mode)
|
||||
{
|
||||
gpio_init(sck_pin, GPO, GPIO_LOW, GPO_PUSH_PULL); // IO 初始化
|
||||
}
|
||||
else
|
||||
{
|
||||
gpio_init(sck_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); // IO 初始化
|
||||
}
|
||||
gpio_init(mosi_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); // IO 初始化
|
||||
|
||||
if(SOFT_SPI_PIN_NULL == miso_pin)
|
||||
{
|
||||
soft_spi_obj->config.use_miso = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
soft_spi_obj->config.use_miso = 1;
|
||||
soft_spi_obj->miso_pin = (gpio_pin_enum)miso_pin;
|
||||
gpio_init(soft_spi_obj->miso_pin, GPI, GPIO_HIGH, GPI_FLOATING_IN); // IO 初始化
|
||||
}
|
||||
if(SOFT_SPI_PIN_NULL == cs_pin)
|
||||
{
|
||||
soft_spi_obj->config.use_cs = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
soft_spi_obj->config.use_cs = 1;
|
||||
soft_spi_obj->cs_pin = (gpio_pin_enum)cs_pin;
|
||||
gpio_init(soft_spi_obj->cs_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); // IO 初始化
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_soft_spi
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#ifndef _zf_driver_soft_spi_h_
|
||||
#define _zf_driver_soft_spi_h_
|
||||
|
||||
#include "zf_common_typedef.h"
|
||||
#include "zf_driver_gpio.h"
|
||||
|
||||
#define SOFT_SPI_PIN_NULL (0xFFFF) // 用于区分是否分配引脚
|
||||
|
||||
|
||||
typedef struct //枚举模块号
|
||||
{
|
||||
uint8 mode :6; // SPI 模式
|
||||
uint8 use_miso :1; // 是否使用 MISO 引脚
|
||||
uint8 use_cs :1; // 是否使用 CS 引脚
|
||||
}spi_config_info_struct;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
spi_config_info_struct config; // 配置整体数据
|
||||
gpio_pin_enum sck_pin; // 用于记录对应的引脚编号
|
||||
gpio_pin_enum mosi_pin; // 用于记录对应的引脚编号
|
||||
gpio_pin_enum miso_pin; // 用于记录对应的引脚编号
|
||||
gpio_pin_enum cs_pin; // 用于记录对应的引脚编号
|
||||
uint32 delay; // 模拟 SPI 软延时时长
|
||||
}soft_spi_info_struct;
|
||||
|
||||
//==================================================SOFT_SPI 基础函数====================================================
|
||||
void soft_spi_write_8bit (soft_spi_info_struct *soft_spi_obj, const uint8 data);
|
||||
void soft_spi_write_8bit_array (soft_spi_info_struct *soft_spi_obj, const uint8 *data, uint32 len);
|
||||
|
||||
void soft_spi_write_16bit (soft_spi_info_struct *soft_spi_obj, const uint16 data);
|
||||
void soft_spi_write_16bit_array (soft_spi_info_struct *soft_spi_obj, const uint16 *data, uint32 len);
|
||||
|
||||
void soft_spi_write_8bit_register (soft_spi_info_struct *soft_spi_obj, const uint8 register_name, const uint8 data);
|
||||
void soft_spi_write_8bit_registers (soft_spi_info_struct *soft_spi_obj, const uint8 register_name, const uint8 *data, uint32 len);
|
||||
|
||||
void soft_spi_write_16bit_register (soft_spi_info_struct *soft_spi_obj, const uint16 register_name, const uint16 data);
|
||||
void soft_spi_write_16bit_registers (soft_spi_info_struct *soft_spi_obj, const uint16 register_name, const uint16 *data, uint32 len);
|
||||
|
||||
uint8 soft_spi_read_8bit (soft_spi_info_struct *soft_spi_obj);
|
||||
void soft_spi_read_8bit_array (soft_spi_info_struct *soft_spi_obj, uint8 *data, uint32 len);
|
||||
|
||||
uint16 soft_spi_read_16bit (soft_spi_info_struct *soft_spi_obj);
|
||||
void soft_spi_read_16bit_array (soft_spi_info_struct *soft_spi_obj, uint16 *data, uint32 len);
|
||||
|
||||
uint8 soft_spi_read_8bit_register (soft_spi_info_struct *soft_spi_obj, const uint8 register_name);
|
||||
void soft_spi_read_8bit_registers (soft_spi_info_struct *soft_spi_obj, const uint8 register_name, uint8 *data, uint32 len);
|
||||
|
||||
uint16 soft_spi_read_16bit_register (soft_spi_info_struct *soft_spi_obj, const uint16 register_name);
|
||||
void soft_spi_read_16bit_registers (soft_spi_info_struct *soft_spi_obj, const uint16 register_name, uint16 *data, uint32 len);
|
||||
|
||||
void soft_spi_transfer_8bit (soft_spi_info_struct *soft_spi_obj, const uint8 *write_buffer, uint8 *read_buffer, uint32 len);
|
||||
void soft_spi_transfer_16bit (soft_spi_info_struct *soft_spi_obj, const uint16 *write_buffer, uint16 *read_buffer, uint32 len);
|
||||
|
||||
void soft_spi_init (soft_spi_info_struct *soft_spi_obj, uint8 mode, uint32 delay, gpio_pin_enum sck_pin, gpio_pin_enum mosi_pin, uint32 miso_pin, uint32 cs_pin);
|
||||
//==================================================SOFT_SPI 基础函数====================================================
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,173 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_spi
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
* 2023-04-28 pudding 修复多个SPI同时使用可能产生冲突的问题
|
||||
********************************************************************************************************************/
|
||||
|
||||
#ifndef _zf_driver_spi_h_
|
||||
#define _zf_driver_spi_h_
|
||||
|
||||
#include "zf_common_typedef.h"
|
||||
|
||||
typedef enum // SPI模块号
|
||||
{
|
||||
SPI_0,
|
||||
SPI_1,
|
||||
SPI_2,
|
||||
SPI_3,
|
||||
}spi_index_enum;
|
||||
|
||||
typedef enum // 枚举 SPI 模式 此枚举定义不允许用户修改
|
||||
{
|
||||
SPI_MODE0,
|
||||
SPI_MODE1,
|
||||
SPI_MODE2,
|
||||
SPI_MODE3,
|
||||
}spi_mode_enum;
|
||||
|
||||
typedef enum // 枚举SPI CLK引脚 此枚举定义不允许用户修改
|
||||
{
|
||||
SPI0_SCLK_P20_11 = 0*102+0*6 , SPI0_SCLK_P20_13, // SPI0 CLK 引脚可选范围
|
||||
|
||||
SPI1_SCLK_P10_2 = 1*102+0*6 , SPI1_SCLK_P11_6, // SPI1 CLK 引脚可选范围
|
||||
|
||||
SPI2_SCLK_P13_0 = 2*102+0*6 , SPI2_SCLK_P13_1, SPI2_SCLK_P15_3, SPI2_SCLK_P15_6, SPI2_SCLK_P15_8, // SPI2 CLK 引脚可选范围
|
||||
|
||||
SPI3_SCLK_P02_7 = 3*102+0*6 , SPI3_SCLK_P22_0, SPI3_SCLK_P22_1, SPI3_SCLK_P22_3, SPI3_SCLK_P33_11, // SPI3 CLK 引脚可选范围
|
||||
}spi_sck_pin_enum;
|
||||
|
||||
typedef enum // 枚举SPI MOSI引脚 此枚举定义不允许用户修改
|
||||
{
|
||||
SPI0_MOSI_P20_12 = 0*102+1*6 , SPI0_MOSI_P20_14, // SPI0 MOSI引脚可选范围
|
||||
|
||||
SPI1_MOSI_P10_1 = 1*102+1*6 , SPI1_MOSI_P10_3, SPI1_MOSI_P11_9, // SPI1 MOSI引脚可选范围
|
||||
|
||||
SPI2_MOSI_P13_3 = 2*102+1*6 , SPI2_MOSI_P15_5, SPI2_MOSI_P15_6, // SPI2 MOSI引脚可选范围
|
||||
|
||||
SPI3_MOSI_P02_6 = 3*102+1*6 , SPI3_MOSI_P10_6, SPI3_MOSI_P22_0, SPI3_MOSI_P22_3, SPI3_MOSI_P33_12, // SPI3 MOSI引脚可选范围
|
||||
}spi_mosi_pin_enum;
|
||||
|
||||
typedef enum // 枚举SPI MISO引脚 此枚举定义不允许用户修改
|
||||
{
|
||||
SPI0_MISO_P20_12 = 0*102+2*6 , // SPI0 MISO引脚可选范围
|
||||
|
||||
SPI1_MISO_P10_1 = 1*102+2*6 , SPI1_MISO_P11_3, // SPI1 MISO引脚可选范围
|
||||
|
||||
SPI2_MISO_P15_2 = 2*102+2*6 , SPI2_MISO_P15_4, SPI2_MISO_P15_7, SPI2_MISO_P21_2, SPI2_MISO_P21_3, // SPI2 MISO引脚可选范围
|
||||
|
||||
SPI3_MISO_P02_5 = 3*102+2*6 , SPI3_MISO_P22_1, SPI3_MISO_P21_2, SPI3_MISO_P21_3, SPI3_MISO_P33_13, // SPI3 MISO引脚可选范围
|
||||
}spi_miso_pin_enum;
|
||||
|
||||
typedef enum // 枚举SPI CS引脚 此枚举定义不允许用户修改
|
||||
{
|
||||
SPI0_CS0_P20_8 = 0*102+3*6 , // SPI0 CS0 引脚可选范围
|
||||
SPI0_CS1_P20_9 = 0*102+4*6 ,
|
||||
SPI0_CS2_P20_13 = 0*102+5*6 ,
|
||||
SPI0_CS3_P11_10 = 0*102+6*6 ,
|
||||
SPI0_CS4_P11_11 = 0*102+7*6 ,
|
||||
SPI0_CS5_P11_2 = 0*102+8*6 ,
|
||||
SPI0_CS6_P20_10 = 0*102+9*6 ,
|
||||
SPI0_CS7_P33_5 = 0*102+10*6,
|
||||
SPI0_CS8_P20_6 = 0*102+11*6,
|
||||
SPI0_CS9_P20_3 = 0*102+12*6,
|
||||
SPI0_CS13_P15_0 = 0*102+16*6,
|
||||
|
||||
SPI1_CS0_P20_8 = 1*102+3*6 ,
|
||||
SPI1_CS1_P20_9 = 1*102+4*6 ,
|
||||
SPI1_CS2_P20_13 = 1*102+5*6 ,
|
||||
SPI1_CS3_P11_10 = 1*102+6*6 ,
|
||||
SPI1_CS4_P11_11 = 1*102+7*6 ,
|
||||
SPI1_CS5_P11_2 = 1*102+8*6 ,
|
||||
SPI1_CS6_P33_10 = 1*102+9*6 ,
|
||||
SPI1_CS7_P33_5 = 1*102+10*6,
|
||||
SPI1_CS8_P10_4 = 1*102+11*6,
|
||||
SPI1_CS9_P10_5 = 1*102+12*6,
|
||||
|
||||
SPI2_CS0_P15_2 = 2*102+3*6 ,
|
||||
SPI2_CS1_P14_2 = 2*102+4*6 ,
|
||||
SPI2_CS2_P14_6 = 2*102+5*6 ,
|
||||
SPI2_CS3_P14_3 = 2*102+6*6 ,
|
||||
SPI2_CS5_P15_1 = 2*102+8*6 ,
|
||||
SPI2_CS6_P33_13 = 2*102+9*6 ,
|
||||
SPI2_CS7_P20_10 = 2*102+10*6,
|
||||
SPI2_CS8_P20_6 = 2*102+11*6,
|
||||
SPI2_CS9_P20_3 = 2*102+12*6,
|
||||
|
||||
SPI3_CS0_P02_4 = 3*102+3*6 ,
|
||||
SPI3_CS1_P02_0 = 3*102+4*6 , SPI3_CS1_P33_9,
|
||||
SPI3_CS2_P02_1 = 3*102+5*6 , SPI3_CS2_P33_8,
|
||||
SPI3_CS3_P02_2 = 3*102+6*6 ,
|
||||
SPI3_CS4_P02_3 = 3*102+7*6 ,
|
||||
SPI3_CS5_P02_8 = 3*102+8*6 ,
|
||||
SPI3_CS6_P00_8 = 3*102+9*6 ,
|
||||
SPI3_CS7_P00_9 = 3*102+10*6, SPI3_CS7_P33_7,
|
||||
SPI3_CS8_P10_5 = 3*102+11*6,
|
||||
SPI3_CS11_P33_10 = 3*102+14*6,
|
||||
SPI3_CS12_P22_2 = 3*102+15*6,
|
||||
SPI3_CS13_P23_1 = 3*102+16*6,
|
||||
|
||||
SPI_CS_NULL,
|
||||
}spi_cs_pin_enum;
|
||||
|
||||
//====================================================SPI 基础函数====================================================
|
||||
void spi_write_8bit (spi_index_enum spi_n, const uint8 data);
|
||||
void spi_write_8bit_array (spi_index_enum spi_n, const uint8 *data, uint32 len);
|
||||
|
||||
void spi_write_16bit (spi_index_enum spi_n, const uint16 data);
|
||||
void spi_write_16bit_array (spi_index_enum spi_n, const uint16 *data, uint32 len);
|
||||
|
||||
void spi_write_8bit_register (spi_index_enum spi_n, const uint8 register_name, const uint8 data);
|
||||
void spi_write_8bit_registers (spi_index_enum spi_n, const uint8 register_name, const uint8 *data, uint32 len);
|
||||
|
||||
void spi_write_16bit_register (spi_index_enum spi_n, const uint16 register_name, const uint16 data);
|
||||
void spi_write_16bit_registers (spi_index_enum spi_n, const uint16 register_name, const uint16 *data, uint32 len);
|
||||
|
||||
uint8 spi_read_8bit (spi_index_enum spi_n);
|
||||
void spi_read_8bit_array (spi_index_enum spi_n, uint8 *data, uint32 len);
|
||||
|
||||
uint16 spi_read_16bit (spi_index_enum spi_n);
|
||||
void spi_read_16bit_array (spi_index_enum spi_n, uint16 *data, uint32 len);
|
||||
|
||||
uint8 spi_read_8bit_register (spi_index_enum spi_n, const uint8 register_name);
|
||||
void spi_read_8bit_registers (spi_index_enum spi_n, const uint8 register_name, uint8 *data, uint32 len);
|
||||
|
||||
uint16 spi_read_16bit_register (spi_index_enum spi_n, const uint16 register_name);
|
||||
void spi_read_16bit_registers (spi_index_enum spi_n, const uint16 register_name, uint16 *data, uint32 len);
|
||||
|
||||
void spi_transfer_8bit (spi_index_enum spi_n, const uint8 *write_buffer, uint8 *read_buffer, uint32 len);
|
||||
void spi_transfer_16bit (spi_index_enum spi_n, const uint16 *write_buffer, uint16 *read_buffer, uint32 len);
|
||||
|
||||
void spi_init (spi_index_enum spi_n, spi_mode_enum mode, uint32 baud, spi_sck_pin_enum sck_pin, spi_mosi_pin_enum mosi_pin, spi_miso_pin_enum miso_pin, spi_cs_pin_enum cs_pin);
|
||||
//====================================================SPI 基础函数====================================================
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,74 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_timer
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#include "IfxStm.h"
|
||||
#include "IFXSTM_CFG.h"
|
||||
#include "zf_driver_timer.h"
|
||||
|
||||
static uint32 systick_count[2];
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 systick定时器启动
|
||||
// 返回参数 void
|
||||
// 使用示例 system_start(); // 启动定时器,记录下当前的时间
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void system_start (void)
|
||||
{
|
||||
systick_count[(IfxCpu_getCoreId())] = IfxStm_getLower(IfxStm_getAddress((IfxStm_Index)(IfxCpu_getCoreId())));
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 获得当前System tick timer的值
|
||||
// 返回参数 uint32 返回从开始到现在的时间(单位10ns)
|
||||
// 使用示例 uint32 tim = system_getval();
|
||||
// 备注信息 在核心0调用此函数则使用STM0模块 核心1则使用STM1模块
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint32 system_getval (void)
|
||||
{
|
||||
uint32 time;
|
||||
uint32 stm_clk;
|
||||
|
||||
stm_clk = IfxStm_getFrequency(IfxStm_getAddress((IfxStm_Index)(IfxCpu_getCoreId())));
|
||||
|
||||
time = IfxStm_getLower(IfxStm_getAddress((IfxStm_Index)(IfxCpu_getCoreId())));
|
||||
time = time - systick_count[(IfxCpu_getCoreId())];
|
||||
time = (uint32)((uint64)time * 100000000 / stm_clk);
|
||||
|
||||
return time;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_timer
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
********************************************************************************************************************/
|
||||
|
||||
#ifndef _zf_driver_timer_h_
|
||||
#define _zf_driver_timer_h_
|
||||
|
||||
#include "zf_common_typedef.h"
|
||||
|
||||
//====================================================定时器 基础函数====================================================
|
||||
void system_start (void); // 定时器启动
|
||||
uint32 system_getval (void); // 定时器计数值获取
|
||||
//====================================================定时器 基础函数====================================================
|
||||
|
||||
//====================================================定时器 扩展函数====================================================
|
||||
#define system_getval_ms() (system_getval() / 100000) // 获取当前计时时间 单位ms
|
||||
#define system_getval_us() (system_getval() / 100 ) // 获取当前计时时间 单位us
|
||||
#define system_getval_ns() (system_getval() * 10 ) // 获取当前计时时间 单位ns
|
||||
//====================================================定时器 扩展函数====================================================
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,494 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_uart
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
* 2023-09-27 pudding 修改串口发送和接收的通信逻辑,将直接从底层读取或者写入数据,不再通过中断处理
|
||||
* 2023-10-07 pudding 新增统一回调函数指针
|
||||
********************************************************************************************************************/
|
||||
|
||||
#include "IFXPORT.h"
|
||||
#include "ifxAsclin_reg.h"
|
||||
#include "ifxCpu_Irq.h"
|
||||
#include "IFXASCLIN_CFG.h"
|
||||
#include "SysSe/Bsp/Bsp.h"
|
||||
#include "isr_config.h"
|
||||
#include "zf_common_debug.h"
|
||||
#include "zf_common_function.h"
|
||||
#include "zf_driver_uart.h"
|
||||
|
||||
|
||||
// 创建串口handle变量
|
||||
IfxAsclin_Asc uart0_handle;
|
||||
IfxAsclin_Asc uart1_handle;
|
||||
IfxAsclin_Asc uart2_handle;
|
||||
IfxAsclin_Asc uart3_handle;
|
||||
|
||||
// 创建一个ascConfig的结构体变量,只用于串口初始化
|
||||
static IfxAsclin_Asc_Config uart_config;
|
||||
|
||||
|
||||
// 创建串口缓存数组
|
||||
static uint8 uart0_tx_buffer[1 + sizeof(Ifx_Fifo) + 8];
|
||||
static uint8 uart0_rx_buffer[1 + sizeof(Ifx_Fifo) + 8];
|
||||
static uint8 uart1_tx_buffer[1 + sizeof(Ifx_Fifo) + 8];
|
||||
static uint8 uart1_rx_buffer[1 + sizeof(Ifx_Fifo) + 8];
|
||||
static uint8 uart2_tx_buffer[1 + sizeof(Ifx_Fifo) + 8];
|
||||
static uint8 uart2_rx_buffer[1 + sizeof(Ifx_Fifo) + 8];
|
||||
static uint8 uart3_tx_buffer[1 + sizeof(Ifx_Fifo) + 8];
|
||||
static uint8 uart3_rx_buffer[1 + sizeof(Ifx_Fifo) + 8];
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 串口中断优先级设置
|
||||
// 参数说明 uart_n 串口模块号 参照 zf_driver_uart.h 内 uart_index_enum 枚举体定义
|
||||
// 返回参数 void
|
||||
// 使用示例 uart_set_interrupt_priority(UART_1);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void uart_set_interrupt_priority (uart_index_enum uartn)
|
||||
{
|
||||
switch(uartn)
|
||||
{
|
||||
case UART_0:
|
||||
{
|
||||
uart_config.interrupt.txPriority = UART0_TX_INT_PRIO;
|
||||
uart_config.interrupt.rxPriority = UART0_RX_INT_PRIO;
|
||||
uart_config.interrupt.erPriority = UART0_ER_INT_PRIO;
|
||||
uart_config.interrupt.typeOfService = UART0_INT_SERVICE;
|
||||
}break;
|
||||
case UART_1:
|
||||
{
|
||||
uart_config.interrupt.txPriority = UART1_TX_INT_PRIO;
|
||||
uart_config.interrupt.rxPriority = UART1_RX_INT_PRIO;
|
||||
uart_config.interrupt.erPriority = UART1_ER_INT_PRIO;
|
||||
uart_config.interrupt.typeOfService = UART1_INT_SERVICE;
|
||||
}break;
|
||||
case UART_2:
|
||||
{
|
||||
uart_config.interrupt.txPriority = UART2_TX_INT_PRIO;
|
||||
uart_config.interrupt.rxPriority = UART2_RX_INT_PRIO;
|
||||
uart_config.interrupt.erPriority = UART2_ER_INT_PRIO;
|
||||
uart_config.interrupt.typeOfService = UART2_INT_SERVICE;
|
||||
}break;
|
||||
case UART_3:
|
||||
{
|
||||
uart_config.interrupt.txPriority = UART3_TX_INT_PRIO;
|
||||
uart_config.interrupt.rxPriority = UART3_RX_INT_PRIO;
|
||||
uart_config.interrupt.erPriority = UART3_ER_INT_PRIO;
|
||||
uart_config.interrupt.typeOfService = UART3_INT_SERVICE;
|
||||
}break;
|
||||
default: zf_assert(FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 设置串口缓冲区
|
||||
// 参数说明 uart_n 串口模块号 参照 zf_driver_uart.h 内 uart_index_enum 枚举体定义
|
||||
// 返回参数 void
|
||||
// 使用示例 uart_set_buffer(UART_1);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void uart_set_buffer (uart_index_enum uartn)
|
||||
{
|
||||
switch(uartn)
|
||||
{
|
||||
case UART_0:
|
||||
{
|
||||
uart_config.txBuffer = &uart0_tx_buffer;
|
||||
uart_config.rxBuffer = &uart0_rx_buffer;
|
||||
uart_config.txBufferSize = 1;
|
||||
uart_config.rxBufferSize = 1;
|
||||
}break;
|
||||
case UART_1:
|
||||
{
|
||||
uart_config.txBuffer = &uart1_tx_buffer;
|
||||
uart_config.rxBuffer = &uart1_rx_buffer;
|
||||
uart_config.txBufferSize = 1;
|
||||
uart_config.rxBufferSize = 1;
|
||||
}break;
|
||||
case UART_2:
|
||||
{
|
||||
uart_config.txBuffer = &uart2_tx_buffer;
|
||||
uart_config.rxBuffer = &uart2_rx_buffer;
|
||||
uart_config.txBufferSize = 1;
|
||||
uart_config.rxBufferSize = 1;
|
||||
}break;
|
||||
case UART_3:
|
||||
{
|
||||
uart_config.txBuffer = &uart3_tx_buffer;
|
||||
uart_config.rxBuffer = &uart3_rx_buffer;
|
||||
uart_config.txBufferSize = 1;
|
||||
uart_config.rxBufferSize = 1;
|
||||
}break;
|
||||
default: IFX_ASSERT(IFX_VERBOSE_LEVEL_ERROR, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 获取串口中断配置信息
|
||||
// 参数说明 uart_n 串口模块号 参照 zf_driver_uart.h 内 uart_index_enum 枚举体定义
|
||||
// 返回参数 void
|
||||
// 使用示例 uart_get_handle(UART_1);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
IfxAsclin_Asc* uart_get_handle (uart_index_enum uartn)
|
||||
{
|
||||
IfxAsclin_Asc* uart_handle = NULL;
|
||||
switch(uartn)
|
||||
{
|
||||
case UART_0: uart_handle = &uart0_handle; break;
|
||||
case UART_1: uart_handle = &uart1_handle; break;
|
||||
case UART_2: uart_handle = &uart2_handle; break;
|
||||
case UART_3: uart_handle = &uart3_handle; break;
|
||||
default: IFX_ASSERT(IFX_VERBOSE_LEVEL_ERROR, FALSE);
|
||||
}
|
||||
return uart_handle;
|
||||
}
|
||||
|
||||
|
||||
void uart_mux (uart_index_enum uartn, uart_tx_pin_enum tx_pin, uart_rx_pin_enum rx_pin, uint32 *set_tx_pin, uint32 *set_rx_pin)
|
||||
{
|
||||
switch(uartn)
|
||||
{
|
||||
case UART_0:
|
||||
{
|
||||
if (UART0_TX_P14_0 == tx_pin) *set_tx_pin = (uint32)&IfxAsclin0_TX_P14_0_OUT;
|
||||
else if(UART0_TX_P14_1 == tx_pin) *set_tx_pin = (uint32)&IfxAsclin0_TX_P14_1_OUT;
|
||||
else if(UART0_TX_P15_2 == tx_pin) *set_tx_pin = (uint32)&IfxAsclin0_TX_P15_2_OUT;
|
||||
else if(UART0_TX_P15_3 == tx_pin) *set_tx_pin = (uint32)&IfxAsclin0_TX_P15_3_OUT;
|
||||
else IFX_ASSERT(IFX_VERBOSE_LEVEL_ERROR, FALSE);
|
||||
|
||||
if (UART0_RX_P14_1 == rx_pin) *set_rx_pin = (uint32)&IfxAsclin0_RXA_P14_1_IN;
|
||||
else if(UART0_RX_P15_3 == rx_pin) *set_rx_pin = (uint32)&IfxAsclin0_RXB_P15_3_IN;
|
||||
else IFX_ASSERT(IFX_VERBOSE_LEVEL_ERROR, FALSE);
|
||||
|
||||
}break;
|
||||
case UART_1:
|
||||
{
|
||||
if (UART1_TX_P02_2 == tx_pin) *set_tx_pin = (uint32)&IfxAsclin1_TX_P02_2_OUT;
|
||||
else if(UART1_TX_P11_12 == tx_pin) *set_tx_pin = (uint32)&IfxAsclin1_TX_P11_12_OUT;
|
||||
else if(UART1_TX_P15_0 == tx_pin) *set_tx_pin = (uint32)&IfxAsclin1_TX_P15_0_OUT;
|
||||
else if(UART1_TX_P15_1 == tx_pin) *set_tx_pin = (uint32)&IfxAsclin1_TX_P15_1_OUT;
|
||||
else if(UART1_TX_P15_4 == tx_pin) *set_tx_pin = (uint32)&IfxAsclin1_TX_P15_4_OUT;
|
||||
else if(UART1_TX_P15_5 == tx_pin) *set_tx_pin = (uint32)&IfxAsclin1_TX_P15_5_OUT;
|
||||
else if(UART1_TX_P20_10 == tx_pin) *set_tx_pin = (uint32)&IfxAsclin1_TX_P20_10_OUT;
|
||||
else if(UART1_TX_P33_12 == tx_pin) *set_tx_pin = (uint32)&IfxAsclin1_TX_P33_12_OUT;
|
||||
else if(UART1_TX_P33_13 == tx_pin) *set_tx_pin = (uint32)&IfxAsclin1_TX_P33_13_OUT;
|
||||
else IFX_ASSERT(IFX_VERBOSE_LEVEL_ERROR, FALSE);
|
||||
|
||||
if (UART1_RX_P15_1 == rx_pin) *set_rx_pin = (uint32)&IfxAsclin1_RXA_P15_1_IN;
|
||||
else if(UART1_RX_P15_5 == rx_pin) *set_rx_pin = (uint32)&IfxAsclin1_RXB_P15_5_IN;
|
||||
else if(UART1_RX_P20_9 == rx_pin) *set_rx_pin = (uint32)&IfxAsclin1_RXC_P20_9_IN;
|
||||
else if(UART1_RX_P11_10 == rx_pin) *set_rx_pin = (uint32)&IfxAsclin1_RXE_P11_10_IN;
|
||||
else if(UART1_RX_P33_13 == rx_pin) *set_rx_pin = (uint32)&IfxAsclin1_RXF_P33_13_IN;
|
||||
else if(UART1_RX_P02_3 == rx_pin) *set_rx_pin = (uint32)&IfxAsclin1_RXG_P02_3_IN;
|
||||
else IFX_ASSERT(IFX_VERBOSE_LEVEL_ERROR, FALSE);
|
||||
|
||||
}break;
|
||||
case UART_2:
|
||||
{
|
||||
if (UART2_TX_P02_0 == tx_pin) *set_tx_pin = (uint32)&IfxAsclin2_TX_P02_0_OUT;
|
||||
else if(UART2_TX_P10_5 == tx_pin) *set_tx_pin = (uint32)&IfxAsclin2_TX_P10_5_OUT;
|
||||
else if(UART2_TX_P14_2 == tx_pin) *set_tx_pin = (uint32)&IfxAsclin2_TX_P14_2_OUT;
|
||||
else if(UART2_TX_P14_3 == tx_pin) *set_tx_pin = (uint32)&IfxAsclin2_TX_P14_3_OUT;
|
||||
else if(UART2_TX_P33_8 == tx_pin) *set_tx_pin = (uint32)&IfxAsclin2_TX_P33_8_OUT;
|
||||
else if(UART2_TX_P33_9 == tx_pin) *set_tx_pin = (uint32)&IfxAsclin2_TX_P33_9_OUT;
|
||||
else IFX_ASSERT(IFX_VERBOSE_LEVEL_ERROR, FALSE);
|
||||
|
||||
if (UART2_RX_P14_3 == rx_pin) *set_rx_pin = (uint32)&IfxAsclin2_RXA_P14_3_IN;
|
||||
else if(UART2_RX_P02_1 == rx_pin) *set_rx_pin = (uint32)&IfxAsclin2_RXB_P02_1_IN;
|
||||
else if(UART2_RX_P10_6 == rx_pin) *set_rx_pin = (uint32)&IfxAsclin2_RXD_P10_6_IN;
|
||||
else if(UART2_RX_P33_8 == rx_pin) *set_rx_pin = (uint32)&IfxAsclin2_RXE_P33_8_IN;
|
||||
else if(UART2_RX_P02_0 == rx_pin) *set_rx_pin = (uint32)&IfxAsclin2_RXG_P02_0_IN;
|
||||
|
||||
else IFX_ASSERT(IFX_VERBOSE_LEVEL_ERROR, FALSE);
|
||||
|
||||
}break;
|
||||
case UART_3:
|
||||
{
|
||||
if (UART3_TX_P00_0 == tx_pin) *set_tx_pin = (uint32)&IfxAsclin3_TX_P00_0_OUT;
|
||||
else if(UART3_TX_P00_1 == tx_pin) *set_tx_pin = (uint32)&IfxAsclin3_TX_P00_1_OUT;
|
||||
else if(UART3_TX_P15_6 == tx_pin) *set_tx_pin = (uint32)&IfxAsclin3_TX_P15_6_OUT;
|
||||
else if(UART3_TX_P15_7 == tx_pin) *set_tx_pin = (uint32)&IfxAsclin3_TX_P15_7_OUT;
|
||||
else if(UART3_TX_P20_0 == tx_pin) *set_tx_pin = (uint32)&IfxAsclin3_TX_P20_0_OUT;
|
||||
else if(UART3_TX_P20_3 == tx_pin) *set_tx_pin = (uint32)&IfxAsclin3_TX_P20_3_OUT;
|
||||
else if(UART3_TX_P21_7 == tx_pin) *set_tx_pin = (uint32)&IfxAsclin3_TX_P21_7_OUT;
|
||||
else IFX_ASSERT(IFX_VERBOSE_LEVEL_ERROR, FALSE);
|
||||
|
||||
if (UART3_RX_P15_7 == rx_pin) *set_rx_pin = (uint32)&IfxAsclin3_RXA_P15_7_IN;
|
||||
else if(UART3_RX_P20_3 == rx_pin) *set_rx_pin = (uint32)&IfxAsclin3_RXC_P20_3_IN;
|
||||
else if(UART3_RX_P00_1 == rx_pin) *set_rx_pin = (uint32)&IfxAsclin3_RXE_P00_1_IN;
|
||||
else if(UART3_RX_P21_6 == rx_pin) *set_rx_pin = (uint32)&IfxAsclin3_RXF_P21_6_IN;
|
||||
else IFX_ASSERT(IFX_VERBOSE_LEVEL_ERROR, FALSE);
|
||||
|
||||
}break;
|
||||
default:break;
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 串口发送写入
|
||||
// 参数说明 uart_n 串口模块号 参照 zf_driver_uart.h 内 uart_index_enum 枚举体定义
|
||||
// 参数说明 dat 需要发送的字节
|
||||
// 返回参数 void
|
||||
// 使用示例 uart_write_byte(UART_1, 0xA5); // 往串口1的发送缓冲区写入0xA5,写入后仍然会发送数据,但是会减少CPU在串口的执行时
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void uart_write_byte (uart_index_enum uart_n, const uint8 dat)
|
||||
{
|
||||
IfxAsclin_Asc* uart_handle;
|
||||
uart_handle = uart_get_handle(uart_n);
|
||||
|
||||
IfxAsclin_write8(uart_handle->asclin, &dat, 1);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 串口发送数组
|
||||
// 参数说明 uart_n 串口模块号 参照 zf_driver_uart.h 内 uart_index_enum 枚举体定义
|
||||
// 参数说明 *buff 要发送的数组地址
|
||||
// 参数说明 len 发送长度
|
||||
// 返回参数 void
|
||||
// 使用示例 uart_write_buffer(UART_1, &a[0], 5);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void uart_write_buffer (uart_index_enum uart_n, const uint8 *buff, uint32 len)
|
||||
{
|
||||
IfxAsclin_Asc* uart_handle;
|
||||
uart_handle = uart_get_handle(uart_n);
|
||||
|
||||
IfxAsclin_write8(uart_handle->asclin, buff, len);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 串口发送字符串
|
||||
// 参数说明 uart_n 串口模块号 参照 zf_driver_uart.h 内 uart_index_enum 枚举体定义
|
||||
// 参数说明 *str 要发送的字符串地址
|
||||
// 返回参数 void
|
||||
// 使用示例 uart_write_string(UART_1, "seekfree");
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void uart_write_string (uart_index_enum uart_n, const char *str)
|
||||
{
|
||||
while(*str)
|
||||
{
|
||||
uart_write_byte(uart_n, *str++);
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 读取串口接收的数据(whlie等待)
|
||||
// 参数说明 uart_n 串口模块号 参照 zf_driver_uart.h 内 uart_index_enum 枚举体定义
|
||||
// 参数说明 *dat 接收数据的地址
|
||||
// 返回参数 uint8 接收的数据
|
||||
// 使用示例 uint8 dat = uart_read_byte(UART_1); // 接收 UART_1 数据 存在在 dat 变量里
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 uart_read_byte (uart_index_enum uart_n)
|
||||
{
|
||||
|
||||
uint8 return_num = 0;
|
||||
IfxAsclin_Asc* uart_handle;
|
||||
uart_handle = uart_get_handle(uart_n);
|
||||
while(IfxAsclin_getRxFifoFillLevel(uart_handle->asclin) == 0);
|
||||
IfxAsclin_read8(uart_handle->asclin, &return_num, 1);
|
||||
|
||||
return return_num;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 读取串口接收的数据(查询接收)
|
||||
// 参数说明 uart_n 串口模块号 参照 zf_driver_uart.h 内 uart_index_enum 枚举体定义
|
||||
// 参数说明 *dat 接收数据的地址
|
||||
// 返回参数 uint8 1:接收成功 0:未接收到数据
|
||||
// 使用示例 uint8 dat; uart_query_byte(UART_1, &dat); // 接收 UART_1 数据 存在在 dat 变量里
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
uint8 uart_query_byte (uart_index_enum uart_n, uint8 *dat)
|
||||
{
|
||||
uint8 return_num = 0;
|
||||
IfxAsclin_Asc* uart_handle;
|
||||
uart_handle = uart_get_handle(uart_n);
|
||||
if(IfxAsclin_getRxFifoFillLevel(uart_handle->asclin) > 0)
|
||||
{
|
||||
IfxAsclin_read8(uart_handle->asclin, dat, 1);
|
||||
return_num = 1;
|
||||
}
|
||||
return return_num;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 串口发送中断设置
|
||||
// 参数说明 uart_n 串口模块号
|
||||
// 参数说明 status 1:打开中断 0:关闭中断
|
||||
// 返回参数 void
|
||||
// 使用示例 uart_tx_interrupt(UART_1, 1); // 打开串口1发送中断
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void uart_tx_interrupt (uart_index_enum uart_n, uint32 status)
|
||||
{
|
||||
Ifx_ASCLIN *asclinSFR = uart_config.asclin;
|
||||
volatile Ifx_SRC_SRCR *src;
|
||||
volatile Ifx_ASCLIN *moudle = IfxAsclin_getAddress((IfxAsclin_Index)uart_n);
|
||||
|
||||
IfxAsclin_Asc_initModuleConfig(&uart_config, moudle); // 初始化化配置结构体
|
||||
src = IfxAsclin_getSrcPointerTx(asclinSFR);
|
||||
IfxAsclin_enableTxFifoFillLevelFlag(asclinSFR, (boolean)status);
|
||||
if(status)
|
||||
{
|
||||
IfxSrc_enable(src);
|
||||
}
|
||||
else
|
||||
{
|
||||
IfxSrc_disable(src);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 串口接收中断设置
|
||||
// 参数说明 uart_n 串口模块号
|
||||
// 参数说明 status 1:打开中断 0:关闭中断
|
||||
// 返回参数 void
|
||||
// 使用示例 uart_rx_interrupt(UART_1, 1); // 打开串口1接收中断
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void uart_rx_interrupt (uart_index_enum uart_n, uint32 status)
|
||||
{
|
||||
Ifx_ASCLIN *asclinSFR = uart_config.asclin;
|
||||
volatile Ifx_SRC_SRCR *src;
|
||||
volatile Ifx_ASCLIN *moudle = IfxAsclin_getAddress((IfxAsclin_Index)uart_n);
|
||||
|
||||
IfxAsclin_Asc_initModuleConfig(&uart_config, moudle); // 初始化化配置结构体
|
||||
src = IfxAsclin_getSrcPointerRx(asclinSFR);
|
||||
IfxAsclin_enableRxFifoFillLevelFlag(asclinSFR, (boolean)status);
|
||||
if(status)
|
||||
{
|
||||
IfxSrc_enable(src);
|
||||
}
|
||||
else
|
||||
{
|
||||
IfxSrc_disable(src);
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 sbus初始化
|
||||
// 参数说明 uartn 串口通道(UART_0,UART_1,UART_2,UART_3)
|
||||
// 参数说明 baud 串口波特率
|
||||
// 参数说明 tx_pin 串口发送引脚号
|
||||
// 参数说明 rx_pin 串口接收引脚号
|
||||
// 返回参数 void
|
||||
// 使用示例 uart_sbus_init(UART_2, 100000, UART2_TX_P10_5, UART2_RX_P10_6);
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void uart_sbus_init (uart_index_enum uartn, uint32 baud, uart_tx_pin_enum tx_pin, uart_rx_pin_enum rx_pin)
|
||||
{
|
||||
|
||||
boolean interrupt_state = disableInterrupts();
|
||||
|
||||
volatile Ifx_ASCLIN *moudle = IfxAsclin_getAddress((IfxAsclin_Index)uartn);
|
||||
|
||||
IfxAsclin_Asc_initModuleConfig(&uart_config, moudle); // 初始化化配置结构体
|
||||
|
||||
uart_set_buffer(uartn); // 设置缓冲区
|
||||
|
||||
uart_set_interrupt_priority(uartn); // 设置中断优先级
|
||||
|
||||
uart_config.clockSource = IfxAsclin_ClockSource_ascFastClock; // 使用高速时钟 最大波特率6.25M
|
||||
uart_config.baudrate.prescaler = 4;
|
||||
uart_config.baudrate.baudrate = (float32)baud;
|
||||
uart_config.baudrate.oversampling = IfxAsclin_OversamplingFactor_8;
|
||||
|
||||
uart_config.frame.stopBit = IfxAsclin_StopBit_2; //停止位
|
||||
uart_config.frame.parityType = IfxAsclin_ParityType_even; //偶校验
|
||||
uart_config.frame.dataLength = IfxAsclin_DataLength_8;
|
||||
uart_config.frame.parityBit = TRUE; //启动校验
|
||||
|
||||
IfxAsclin_Asc_Pins pins; // 设置引脚
|
||||
pins.cts = NULL;
|
||||
pins.rts = NULL;
|
||||
uart_mux(uartn, tx_pin, rx_pin, (uint32 *)&pins.tx, (uint32 *)&pins.rx);
|
||||
pins.rxMode = IfxPort_InputMode_pullUp;
|
||||
pins.txMode = IfxPort_OutputMode_pushPull;
|
||||
pins.pinDriver = IfxPort_PadDriver_cmosAutomotiveSpeed1;
|
||||
uart_config.pins = &pins;
|
||||
|
||||
IfxAsclin_Asc_initModule(uart_get_handle(uartn), &uart_config);
|
||||
uart_rx_interrupt(uartn, 1);
|
||||
uart_tx_interrupt(uartn, 0);
|
||||
restoreInterrupts(interrupt_state);
|
||||
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// 函数简介 串口初始化
|
||||
// 参数说明 uartn 串口模块号(UART_0,UART_1,UART_2,UART_3)
|
||||
// 参数说明 baud 串口波特率
|
||||
// 参数说明 tx_pin 串口发送引脚
|
||||
// 参数说明 rx_pin 串口接收引脚
|
||||
// 返回参数 uint32 实际波特率
|
||||
// 使用示例 uart_init(UART_0,115200,UART0_TX_P14_0,UART0_RX_P14_1); // 初始化串口0 波特率115200 发送引脚使用P14_0 接收引脚使用P14_1
|
||||
// 备注信息
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
void uart_init (uart_index_enum uart_n, uint32 baud, uart_tx_pin_enum tx_pin, uart_rx_pin_enum rx_pin)
|
||||
{
|
||||
boolean interrupt_state = disableInterrupts();
|
||||
|
||||
volatile Ifx_ASCLIN *moudle = IfxAsclin_getAddress((IfxAsclin_Index)uart_n);
|
||||
|
||||
IfxAsclin_Asc_initModuleConfig(&uart_config, moudle); // 初始化化配置结构体
|
||||
|
||||
uart_set_buffer(uart_n); // 设置缓冲区
|
||||
|
||||
uart_set_interrupt_priority(uart_n); // 设置中断优先级
|
||||
|
||||
uart_config.clockSource = IfxAsclin_ClockSource_ascFastClock; // 使用高速时钟 最大波特率6.25M
|
||||
uart_config.baudrate.prescaler = 4;
|
||||
uart_config.baudrate.baudrate = (float32)baud;
|
||||
uart_config.baudrate.oversampling = IfxAsclin_OversamplingFactor_8;
|
||||
|
||||
IfxAsclin_Asc_Pins pins; // 设置引脚
|
||||
pins.cts = NULL;
|
||||
pins.rts = NULL;
|
||||
uart_mux(uart_n, tx_pin, rx_pin, (uint32 *)&pins.tx, (uint32 *)&pins.rx);
|
||||
pins.rxMode = IfxPort_InputMode_pullUp;
|
||||
pins.txMode = IfxPort_OutputMode_pushPull;
|
||||
pins.pinDriver = IfxPort_PadDriver_cmosAutomotiveSpeed1;
|
||||
uart_config.pins = &pins;
|
||||
|
||||
IfxAsclin_Asc_initModule(uart_get_handle(uart_n), &uart_config);
|
||||
uart_rx_interrupt(uart_n, 0);
|
||||
uart_tx_interrupt(uart_n, 0);
|
||||
restoreInterrupts(interrupt_state);
|
||||
}
|
||||
@@ -0,0 +1,146 @@
|
||||
/*********************************************************************************************************************
|
||||
* TC264 Opensourec Library 即(TC264 开源库)是一个基于官方 SDK 接口的第三方开源库
|
||||
* Copyright (c) 2022 SEEKFREE 逐飞科技
|
||||
*
|
||||
* 本文件是 TC264 开源库的一部分
|
||||
*
|
||||
* TC264 开源库 是免费软件
|
||||
* 您可以根据自由软件基金会发布的 GPL(GNU General Public License,即 GNU通用公共许可证)的条款
|
||||
* 即 GPL 的第3版(即 GPL3.0)或(您选择的)任何后来的版本,重新发布和/或修改它
|
||||
*
|
||||
* 本开源库的发布是希望它能发挥作用,但并未对其作任何的保证
|
||||
* 甚至没有隐含的适销性或适合特定用途的保证
|
||||
* 更多细节请参见 GPL
|
||||
*
|
||||
* 您应该在收到本开源库的同时收到一份 GPL 的副本
|
||||
* 如果没有,请参阅<https://www.gnu.org/licenses/>
|
||||
*
|
||||
* 额外注明:
|
||||
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
|
||||
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
|
||||
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
|
||||
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明(即本声明)
|
||||
*
|
||||
* 文件名称 zf_driver_uart
|
||||
* 公司名称 成都逐飞科技有限公司
|
||||
* 版本信息 查看 libraries/doc 文件夹内 version 文件 版本说明
|
||||
* 开发环境 ADS v1.10.2
|
||||
* 适用平台 TC264D
|
||||
* 店铺链接 https://seekfree.taobao.com/
|
||||
*
|
||||
* 修改记录
|
||||
* 日期 作者 备注
|
||||
* 2022-09-15 pudding first version
|
||||
* 2023-10-07 pudding 新增统一回调函数指针
|
||||
********************************************************************************************************************/
|
||||
|
||||
#ifndef _zf_driver_uart_h_
|
||||
#define _zf_driver_uart_h_
|
||||
|
||||
#include "ifxAsclin_Asc.h"
|
||||
#include "zf_common_typedef.h"
|
||||
|
||||
typedef enum // 枚举串口引脚 此枚举定义不允许用户修改
|
||||
{
|
||||
UART0_TX_P14_0, // 串口0 发送引脚可选范围
|
||||
UART0_TX_P14_1,
|
||||
UART0_TX_P15_2,
|
||||
UART0_TX_P15_3,
|
||||
|
||||
UART1_TX_P02_2, // 串口1 发送引脚可选范围
|
||||
UART1_TX_P11_12,
|
||||
UART1_TX_P15_0,
|
||||
UART1_TX_P15_1,
|
||||
UART1_TX_P15_4,
|
||||
UART1_TX_P15_5,
|
||||
UART1_TX_P20_10,
|
||||
UART1_TX_P33_12,
|
||||
UART1_TX_P33_13,
|
||||
|
||||
UART2_TX_P02_0, // 串口2 发送引脚可选范围
|
||||
UART2_TX_P10_5,
|
||||
UART2_TX_P14_2,
|
||||
UART2_TX_P14_3,
|
||||
UART2_TX_P33_8,
|
||||
UART2_TX_P33_9,
|
||||
|
||||
UART3_TX_P00_0, // 串口3 发送引脚可选范围
|
||||
UART3_TX_P00_1,
|
||||
UART3_TX_P15_6,
|
||||
UART3_TX_P15_7,
|
||||
UART3_TX_P20_0,
|
||||
UART3_TX_P20_3,
|
||||
UART3_TX_P21_7,
|
||||
}uart_tx_pin_enum;
|
||||
|
||||
|
||||
typedef enum // 枚举串口引脚 此枚举定义不允许用户修改
|
||||
{
|
||||
|
||||
UART0_RX_P14_1, // 串口0 接收引脚可选范围
|
||||
UART0_RX_P15_3,
|
||||
|
||||
UART1_RX_P02_3, // 串口1 接收引脚可选范围
|
||||
UART1_RX_P11_10,
|
||||
UART1_RX_P15_1,
|
||||
UART1_RX_P15_5,
|
||||
UART1_RX_P20_9,
|
||||
UART1_RX_P33_13,
|
||||
|
||||
UART2_RX_P02_0, // 串口2 接收引脚可选范围
|
||||
UART2_RX_P02_1,
|
||||
UART2_RX_P10_6,
|
||||
UART2_RX_P14_3,
|
||||
UART2_RX_P33_8,
|
||||
|
||||
UART3_RX_P00_1, // 串口3 接收引脚可选范围
|
||||
UART3_RX_P15_7,
|
||||
UART3_RX_P20_3,
|
||||
UART3_RX_P21_6,
|
||||
}uart_rx_pin_enum;
|
||||
|
||||
|
||||
typedef enum // 枚举串口号 此枚举定义不允许用户修改
|
||||
{
|
||||
UART_0,
|
||||
UART_1,
|
||||
UART_2,
|
||||
UART_3,
|
||||
}uart_index_enum;
|
||||
|
||||
//创建串口handle变量
|
||||
extern IfxAsclin_Asc uart0_handle;
|
||||
extern IfxAsclin_Asc uart1_handle;
|
||||
extern IfxAsclin_Asc uart2_handle;
|
||||
extern IfxAsclin_Asc uart3_handle;
|
||||
|
||||
//====================================================串口 基础函数====================================================
|
||||
void uart_write_byte (uart_index_enum uartn, const uint8 dat);
|
||||
void uart_write_buffer (uart_index_enum uartn, const uint8 *buff, uint32 len);
|
||||
void uart_write_string (uart_index_enum uartn, const char *str);
|
||||
|
||||
uint8 uart_read_byte (uart_index_enum uartn);
|
||||
uint8 uart_query_byte (uart_index_enum uartn, uint8 *dat);
|
||||
|
||||
void uart_tx_interrupt (uart_index_enum uartn, uint32 status);
|
||||
void uart_rx_interrupt (uart_index_enum uartn, uint32 status);
|
||||
|
||||
void uart_sbus_init (uart_index_enum uartn, uint32 baud, uart_tx_pin_enum tx_pin, uart_rx_pin_enum rx_pin);
|
||||
void uart_init (uart_index_enum uartn, uint32 baud, uart_tx_pin_enum tx_pin, uart_rx_pin_enum rx_pin);
|
||||
//====================================================串口 基础函数====================================================
|
||||
|
||||
//=================================================兼容旧版本开源库接口名称=================================================
|
||||
#ifdef COMPATIBLE_WITH_OLDER_VERSIONS
|
||||
#define uart_putchar(uart_n, dat) (uart_write_byte((uart_n), (dat)))
|
||||
#define uart_putbuff(uart_n, buff, len) (uart_write_buffer((uart_n), (buff), (len)))
|
||||
#define uart_putstr(uart_n, str) (uart_write_string((uart_n), (str)))
|
||||
|
||||
#define uart_getchar(uart_n, dat) (*(dat) = uart_read_byte((uart_n)))
|
||||
#define uart_query(uart_n, dat) (uart_query_byte((uart_n), (dat)))
|
||||
|
||||
#define uart_tx_irq(uart_n, status) (uart_tx_interrupt((uart_n), (status)))
|
||||
#define uart_rx_irq(uart_n, status) (uart_rx_interrupt((uart_n), (status)))
|
||||
#endif
|
||||
//=================================================兼容旧版本开源库接口名称=================================================
|
||||
|
||||
#endif
|
||||
Reference in new issue
Block a user