Init
commit
97aa90ab4a
|
@ -0,0 +1 @@
|
|||
/cmake-build-debug/
|
|
@ -0,0 +1,18 @@
|
|||
cmake_minimum_required(VERSION 3.27)
|
||||
project(HW_Lib C)
|
||||
|
||||
set(CMAKE_C_STANDARD 23)
|
||||
|
||||
include_directories(
|
||||
lib/inc
|
||||
lib/inc/log
|
||||
lib/inc/spi
|
||||
lib/inc/iic
|
||||
demo/spi
|
||||
)
|
||||
|
||||
file(GLOB_RECURSE SOURCES
|
||||
"lib/src/*.*"
|
||||
"demo/*/*.*")
|
||||
|
||||
add_executable(HW_Lib main.c ${SOURCES})
|
|
@ -0,0 +1,8 @@
|
|||
//
|
||||
// Created by lydxh on 2024/4/8.
|
||||
//
|
||||
|
||||
#ifndef HW_LIB_T_SPI_H
|
||||
#define HW_LIB_T_SPI_H
|
||||
void Test_spi();
|
||||
#endif //HW_LIB_T_SPI_H
|
|
@ -0,0 +1,62 @@
|
|||
//
|
||||
// Created by lydxh on 2024/4/8.
|
||||
//
|
||||
#include <stdio.h>
|
||||
#include "t_spi.h"
|
||||
#include "spi.h"
|
||||
#include "log.h"
|
||||
#include "tool.h"
|
||||
|
||||
static uint8_t p;
|
||||
|
||||
uint8_t Mosi_Pin(uint8_t l) {
|
||||
// LOGT("MOSI","P:%d",l);
|
||||
p = l;
|
||||
return l;
|
||||
}
|
||||
|
||||
uint8_t Sck_Pin(uint8_t l) {
|
||||
// LOGT("SCK","P:%d",l);
|
||||
return l;
|
||||
}
|
||||
|
||||
uint8_t Cs_Pin(uint8_t l) {
|
||||
// LOGT("CS","P:%d",l);
|
||||
return l;
|
||||
}
|
||||
|
||||
uint8_t Miso_Pin() {
|
||||
// uint8_t l=rand() % 2;
|
||||
uint8_t l = p;
|
||||
// LOGT("MISO","P:%d",l);
|
||||
return l;
|
||||
}
|
||||
|
||||
void Test_spi() {
|
||||
HW_Dev_Spi ltl = {
|
||||
.MOSI_SET=Mosi_Pin,
|
||||
.SCK_SET=Sck_Pin,
|
||||
.MISO=Miso_Pin,
|
||||
.CS_SET=Cs_Pin,
|
||||
.MODE=Mode0,
|
||||
.CS=LOW,
|
||||
.ENDIAN=LTL,
|
||||
};
|
||||
uint8_t r, t = rand() % 10;
|
||||
r = HW_SPI_RW(ltl, t);
|
||||
LOGI("Tx:%d,Rx:%d", t, r);
|
||||
uint8_t rbuf[64], tbuf[64];
|
||||
for (int i = 0; i < 64; ++i) {
|
||||
tbuf[i] = rand() % 10;
|
||||
}
|
||||
HW_SPI_RWL(ltl, rbuf, tbuf, 64);
|
||||
BufPrint("TX", tbuf, 8, 64, 8);
|
||||
BufPrint("RX", rbuf, 8, 64, 8);
|
||||
uint16_t rbuf16[64], tbuf16[64];
|
||||
for (int i = 0; i < 64; ++i) {
|
||||
tbuf16[i] = rand() % 1000;
|
||||
}
|
||||
HW_SPI_RWL16(ltl, rbuf16, tbuf16, 64);
|
||||
BufPrint("TX", tbuf16, 16,64, 16);
|
||||
BufPrint("RX", rbuf16, 16,64, 16);
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
//
|
||||
// Created by lydxh on 2024/5/9.
|
||||
//
|
||||
|
||||
#ifndef HW_LIB_IIC_H
|
||||
#define HW_LIB_IIC_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#define HIGH 1
|
||||
#define LOW 0
|
||||
#define IN 1
|
||||
#define OUT 0
|
||||
#define NOP() ;
|
||||
#define DELAY1US() NOP()
|
||||
|
||||
/**
|
||||
* @brief IIC设备结构体
|
||||
**/
|
||||
typedef struct {
|
||||
uint8_t (*CLK_SET)(uint8_t); // 设置时钟引脚状态的函数指针
|
||||
uint8_t (*SDA_SET)(uint8_t); // 设置数据引脚状态的函数指针
|
||||
uint8_t (*SDA); // 读取数据引脚状态的函数指针
|
||||
uint8_t (*SDA_MODE)(uint8_t); // 设置数据引脚模式的函数指针
|
||||
uint8_t ADD; // IIC设备地址
|
||||
} HW_Dev_IIC;
|
||||
|
||||
/**
|
||||
* @brief 向 IIC 设备写入数据流
|
||||
* @param Dev: [输入] IIC设备结构体
|
||||
* @param InternalAddress: [输入] 内部地址
|
||||
* @param Write_Data: [输入] 要写入的数据流指针
|
||||
* @param Len: [输入] 数据流长度
|
||||
* @return void
|
||||
**/
|
||||
void HW_IIC_WL(HW_Dev_IIC Dev, uint8_t InternalAddress, uint8_t *Write_Data, uint32_t Len);
|
||||
|
||||
/**
|
||||
* @brief 从 IIC 设备读取数据流
|
||||
* @param Dev: [输入] IIC设备结构体
|
||||
* @param InternalAddress: [输入] 内部地址
|
||||
* @param Read_Data: [输出] 存储读取数据的缓冲区指针
|
||||
* @param Len: [输入] 读取数据流长度
|
||||
* @param Ack: [输入] 确认应答位
|
||||
* @return void
|
||||
**/
|
||||
void HW_IIC_RL(HW_Dev_IIC Dev, uint8_t InternalAddress, uint8_t *Read_Data, uint32_t Len, uint8_t Ack);
|
||||
|
||||
#endif //HW_LIB_IIC_H
|
|
@ -0,0 +1,146 @@
|
|||
/**
|
||||
* 方便打印日志
|
||||
* 为了保证输出顺序 都使用stdout而不是stderr
|
||||
*
|
||||
* 可配置项(默认都是未定义)
|
||||
* LOG_LINE_END_CRLF 默认是\n结尾 添加此宏将以\r\n结尾
|
||||
* LOG_FOR_MCU MCU项目可配置此宏 更适用于MCU环境
|
||||
* LOG_NDEBUG 关闭LOGD的输出
|
||||
* LOG_SHOW_VERBOSE 显示LOGV的输出
|
||||
* LOG_NOT_EXIT_ON_FATAL FATAL默认退出程序 添加此宏将不退出
|
||||
*/
|
||||
#ifndef HW_LIB_LOG_H
|
||||
#define HW_LIB_LOG_H
|
||||
#pragma once
|
||||
|
||||
#ifdef __cplusplus
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <cstdlib>
|
||||
#else
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
/* 输出日志等级 */
|
||||
#define LOG_LVL_FATAL 0
|
||||
#define LOG_LVL_ERROR 1
|
||||
#define LOG_LVL_WARN 2
|
||||
#define LOG_LVL_INFO 3
|
||||
#define LOG_LVL_DEBUG 4
|
||||
#define LOG_LVL_VERBOSE 5
|
||||
|
||||
// 配置
|
||||
#define LOG_TIMER
|
||||
//#define LOG_FOR_MCU
|
||||
#define LOG_LINE_END_CRLF
|
||||
//#define LOG_WITH_RUN_TIMER
|
||||
#define LOG_RUN_TIMER_WITH_MS
|
||||
#define LOG_OUTPUT_LVL LOG_LVL_INFO
|
||||
////////////////////////
|
||||
|
||||
#ifdef LOG_LINE_END_CRLF
|
||||
#define LOG_LINE_END "\r\n"
|
||||
#else
|
||||
#define LOG_LINE_END "\n"
|
||||
#endif
|
||||
|
||||
#ifdef LOG_NOT_EXIT_ON_FATAL
|
||||
#define LOG_EXIT_PROGRAM()
|
||||
#else
|
||||
#ifdef LOG_FOR_MCU
|
||||
#define LOG_EXIT_PROGRAM() do{ for(;;); } while(0)
|
||||
#else
|
||||
#define LOG_EXIT_PROGRAM() exit(EXIT_FAILURE)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define LOG_BASE_FILENAME \
|
||||
(strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : \
|
||||
strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)
|
||||
|
||||
#define LOG_WITH_COLOR
|
||||
#if defined(_WIN32) || defined(LOG_FOR_MCU)
|
||||
#undef LOG_WITH_COLOR
|
||||
#endif
|
||||
|
||||
#ifdef LOG_WITH_RUN_TIMER
|
||||
#ifdef LOG_RUN_TIMER_WITH_MS
|
||||
#define LOG_RUN_TIMER_FUN System_GetTimeInterval()/1000
|
||||
#define LOG_RUN_TIMER_FMT "-T(%lums)"
|
||||
#else
|
||||
#define LOG_RUN_TIMER_FUN System_GetTimeInterval()
|
||||
#define LOG_RUN_TIMER_FMT "-T(%luus)"
|
||||
#endif
|
||||
#else
|
||||
#define LOG_RUN_TIMER_FUN 0
|
||||
#define LOG_RUN_TIMER_FMT "-T(%lu)"
|
||||
#endif
|
||||
|
||||
#ifdef LOG_WITH_COLOR
|
||||
#define LOG_COLOR_RED "\033[31m"
|
||||
#define LOG_COLOR_GREEN "\033[32m"
|
||||
#define LOG_COLOR_YELLOW "\033[33m"
|
||||
#define LOG_COLOR_BLUE "\033[34m"
|
||||
#define LOG_COLOR_CARMINE "\033[35m"
|
||||
#define LOG_COLOR_CYAN "\033[36m"
|
||||
#define LOG_COLOR_DEFAULT
|
||||
#define LOG_COLOR_END "\033[m"
|
||||
#else
|
||||
#define LOG_COLOR_RED
|
||||
#define LOG_COLOR_GREEN
|
||||
#define LOG_COLOR_YELLOW
|
||||
#define LOG_COLOR_BLUE
|
||||
#define LOG_COLOR_CARMINE
|
||||
#define LOG_COLOR_CYAN
|
||||
#define LOG_COLOR_DEFAULT
|
||||
#define LOG_COLOR_END
|
||||
#endif
|
||||
|
||||
#define LOG_END LOG_COLOR_END LOG_LINE_END
|
||||
|
||||
// 带时钟输出
|
||||
#if defined(LOG_TIMER)
|
||||
#define LOGT(tag, fmt, ...) do{ printf(LOG_COLOR_BLUE "[" tag "]" LOG_RUN_TIMER_FMT ": " fmt LOG_END,LOG_RUN_TIMER_FUN, ##__VA_ARGS__); } while(0)
|
||||
#else
|
||||
#define LOGT(fmt, ...) ((void)0)
|
||||
#endif
|
||||
|
||||
// 等级输出
|
||||
#if LOG_OUTPUT_LVL >= LOG_LVL_FATAL
|
||||
#define LOGF(fmt, ...) do{ printf(LOG_COLOR_CYAN "[F]: %s: %s: %d: " fmt LOG_END, LOG_BASE_FILENAME, __func__, __LINE__, ##__VA_ARGS__); LOG_EXIT_PROGRAM(); } while(0)
|
||||
#else
|
||||
#define LOGF(fmt, ...) ((void)0)
|
||||
#endif
|
||||
|
||||
#if LOG_OUTPUT_LVL >= LOG_LVL_ERROR
|
||||
#define LOGE(fmt, ...) do{ printf(LOG_COLOR_RED "[E]: %s: %s: %d: " fmt LOG_END, LOG_BASE_FILENAME, __func__, __LINE__, ##__VA_ARGS__); } while(0)
|
||||
#else
|
||||
#define LOGE(fmt, ...) ((void)0)
|
||||
#endif
|
||||
|
||||
#if LOG_OUTPUT_LVL >= LOG_LVL_WARN
|
||||
#define LOGW(fmt, ...) do{ printf(LOG_COLOR_CARMINE "[W]: %s: %s: %d: " fmt LOG_END, LOG_BASE_FILENAME, __func__, __LINE__, ##__VA_ARGS__); } while(0)
|
||||
#else
|
||||
#define LOGW(fmt, ...) ((void)0)
|
||||
#endif
|
||||
|
||||
#if LOG_OUTPUT_LVL >= LOG_LVL_INFO
|
||||
#define LOGI(fmt, ...) do{ printf(LOG_COLOR_YELLOW "[I]: %s: " fmt LOG_END, LOG_BASE_FILENAME, ##__VA_ARGS__); } while(0)
|
||||
#else
|
||||
#define LOGI(fmt, ...) ((void)0)
|
||||
#endif
|
||||
|
||||
#if LOG_OUTPUT_LVL >= LOG_LVL_DEBUG
|
||||
#define LOGD(fmt, ...) do{ printf(LOG_COLOR_DEFAULT "[D]: %s: " fmt LOG_END, LOG_BASE_FILENAME, ##__VA_ARGS__); } while(0)
|
||||
#else
|
||||
#define LOGD(fmt, ...) ((void)0)
|
||||
#endif
|
||||
|
||||
#if LOG_OUTPUT_LVL >= LOG_LVL_VERBOSE
|
||||
#define LOGV(fmt, ...) do{ printf(LOG_COLOR_DEFAULT "[V]: %s: " fmt LOG_END, LOG_BASE_FILENAME, ##__VA_ARGS__); } while(0)
|
||||
#else
|
||||
#define LOGV(fmt, ...) ((void)0)
|
||||
#endif
|
||||
#endif //HW_LIB_LOG_H
|
|
@ -0,0 +1,119 @@
|
|||
//
|
||||
// Created by lydxh on 2024/4/8.
|
||||
//
|
||||
|
||||
#ifndef HW_LIB_SPI_H
|
||||
#define HW_LIB_SPI_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#define HIGH 1
|
||||
#define LOW 0
|
||||
#define NOP() ;
|
||||
#define DELAY1US() NOP()
|
||||
|
||||
/**
|
||||
* @brief SPI通信模式枚举
|
||||
**/
|
||||
typedef enum {
|
||||
Mode0, // 时钟空闲状态为低电平,数据在时钟的下降沿采样
|
||||
Mode1, // 时钟空闲状态为低电平,数据在时钟的上升沿采样
|
||||
Mode2, // 时钟空闲状态为高电平,数据在时钟的下降沿采样
|
||||
Mode3 // 时钟空闲状态为高电平,数据在时钟的上升沿采样
|
||||
} mode;
|
||||
|
||||
/**
|
||||
* @brief 数据端序枚举
|
||||
**/
|
||||
typedef enum {
|
||||
LTL, // 小端模式,低字节在低地址
|
||||
LTB, // 小端模式,低字节在高地址
|
||||
BTB, // 大端模式,低字节在低地址
|
||||
BTL // 大端模式,低字节在高地址
|
||||
} endian;
|
||||
/**
|
||||
* @brief SPI设备结构体
|
||||
**/
|
||||
typedef struct {
|
||||
uint8_t (*MOSI_SET)(uint8_t); // 设置MOSI引脚状态的函数指针
|
||||
uint8_t (*SCK_SET)(uint8_t); // 设置SCK引脚状态的函数指针
|
||||
uint8_t (*CS_SET)(uint8_t); // 设置CS引脚状态的函数指针
|
||||
uint8_t (*MISO)(); // 读取MISO引脚状态的函数指针
|
||||
mode MODE; // SPI模式
|
||||
uint8_t CS; // CS引脚编号
|
||||
endian ENDIAN; // 数据端序
|
||||
} HW_Dev_Spi;
|
||||
|
||||
/**
|
||||
* @brief 向 SPI 设备写入一个字节并读取返回的数据
|
||||
* @param Dev: [输入] SPI 设备
|
||||
* @param Write_Date: [输入]要写入的数据
|
||||
* @return 读取到的数据
|
||||
**/
|
||||
uint8_t HW_SPI_RW(HW_Dev_Spi Dev, uint8_t Write_Date);
|
||||
|
||||
/**
|
||||
* @brief 向 SPI 设备写入数据流
|
||||
* @param Dev: [输入] SPI 设备
|
||||
* @param Write_Date: [输入]要写入的数据流指针
|
||||
* @param Len: [输入] 数据流长度
|
||||
* @return void
|
||||
**/
|
||||
void HW_SPI_WL(HW_Dev_Spi Dev, uint8_t *Write_Date, uint32_t Len);
|
||||
|
||||
/**
|
||||
* @brief 从 SPI 设备读取数据流
|
||||
* @param Dev: [输入] SPI 设备
|
||||
* @param Read_Date: [输出]存储读取数据的缓冲区指针
|
||||
* @param Len: [输入] 读取数据流长度
|
||||
* @return void
|
||||
**/
|
||||
void HW_SPI_RL(HW_Dev_Spi Dev, uint8_t *Read_Date, uint32_t Len);
|
||||
|
||||
/**
|
||||
* @brief 向 SPI 设备写入数据并读取返回数据流
|
||||
* @param Dev: [输入] SPI 设备
|
||||
* @param Read_Date: [输出]存储读取数据的缓冲区指针
|
||||
* @param Write_Date: [输入]要写入的数据流指针
|
||||
* @param Len: [输入] 数据流长度
|
||||
* @return void
|
||||
**/
|
||||
void HW_SPI_RWL(HW_Dev_Spi Dev, uint8_t *Read_Date, uint8_t *Write_Date, uint32_t Len);
|
||||
|
||||
/**
|
||||
* @brief 向 SPI 设备写入一个字(16位)并读取返回的数据
|
||||
* @param Dev: [输入] SPI 设备
|
||||
* @param Write_Date: [输入]要写入的数据
|
||||
* @return 读取到的数据
|
||||
**/
|
||||
uint16_t HW_SPI_RW16(HW_Dev_Spi Dev, uint16_t Write_Date);
|
||||
|
||||
/**
|
||||
* @brief 从 SPI 设备读取数据流(16位)
|
||||
* @param Dev: [输入] SPI 设备
|
||||
* @param Read_Date: [输出]存储读取数据的缓冲区指针
|
||||
* @param Len: [输入] 读取数据流长度
|
||||
* @return void
|
||||
**/
|
||||
void HW_SPI_RL16(HW_Dev_Spi Dev, uint16_t *Read_Date, uint32_t Len);
|
||||
|
||||
/**
|
||||
* @brief 向 SPI 设备写入数据流(16位)
|
||||
* @param Dev: [输入] SPI 设备
|
||||
* @param Write_Date: [输入]要写入的数据流指针
|
||||
* @param Len: [输入] 数据流长度
|
||||
* @return void
|
||||
**/
|
||||
void HW_SPI_WL16(HW_Dev_Spi Dev, uint16_t *Write_Date, uint32_t Len);
|
||||
|
||||
/**
|
||||
* @brief 向 SPI 设备写入数据并读取返回数据流(16位)
|
||||
* @param Dev: [输入] SPI 设备
|
||||
* @param Read_Date: [输出]存储读取数据的缓冲区指针
|
||||
* @param Write_Date: [输入]要写入的数据流指针
|
||||
* @param Len: [输入] 数据流长度
|
||||
* @return void
|
||||
**/
|
||||
void HW_SPI_RWL16(HW_Dev_Spi Dev, uint16_t *Read_Date, uint16_t *Write_Date, uint32_t Len);
|
||||
|
||||
#endif //HW_LIB_SPI_H
|
|
@ -0,0 +1,56 @@
|
|||
#ifndef HW_LIB_TOOL_H
|
||||
#define HW_LIB_TOOL_H
|
||||
|
||||
typedef unsigned int u32;
|
||||
typedef unsigned short u16;
|
||||
typedef unsigned char u8;
|
||||
typedef int s32;
|
||||
typedef short int s16;
|
||||
typedef char s8;
|
||||
|
||||
typedef union {
|
||||
int i;
|
||||
char c[4];
|
||||
float f;
|
||||
s8 s8[4];
|
||||
s16 s16[2];
|
||||
s32 s32;
|
||||
u8 u8[4];
|
||||
u16 u16[2];
|
||||
u32 u32;
|
||||
} Data32;
|
||||
|
||||
typedef union {
|
||||
char c[2];
|
||||
s8 s8[2];
|
||||
s16 s16;
|
||||
u8 u8[2];
|
||||
u16 u16;
|
||||
} Data16;
|
||||
|
||||
/**
|
||||
* @Name Mapping
|
||||
* @brief 数据映射(缩放)
|
||||
* @param val: [输入] 数据采集值
|
||||
* @param I_Min: [输入] 数据最小值
|
||||
* @param I_Max: [输入] 数据最大值
|
||||
* @param O_Min: [输入] 需求最小值
|
||||
* @param O_Max: [输入] 需求最小值
|
||||
* @retval 需求处理值
|
||||
* @example Mapping(128,0,4096,0.0,3.3) //0.10
|
||||
* ADC采集引脚电压
|
||||
**/
|
||||
float Mapping(float val, float I_Min, float I_Max, float O_Min, float O_Max);
|
||||
/**
|
||||
* @brief 数组内容HEX打印
|
||||
* @param name: [输入] 标识名
|
||||
* @param buf: [输入] 数组
|
||||
* @param size: [输入] 数组类型大小 [8,16,32]
|
||||
* @param len: [输入] 数组长度
|
||||
* @param frame: [输入] 断帧大小
|
||||
* @return void
|
||||
* @example BufPrint("TX", buf, 8, 64, 16); //将长64的8位buf以16个数据断帧打印
|
||||
**/
|
||||
void BufPrint(char *name,void *buf,unsigned char size,unsigned int len,unsigned char frame);
|
||||
|
||||
#endif //HW_LIB_TOOL_H
|
|
@ -0,0 +1,109 @@
|
|||
#include "iic.h"
|
||||
|
||||
static inline void iic_Start(HW_Dev_IIC dev) {
|
||||
dev.SDA_MODE(OUT);
|
||||
dev.SDA_SET(HIGH);
|
||||
dev.CLK_SET(HIGH);DELAY1US();
|
||||
dev.SDA_SET(LOW);DELAY1US();
|
||||
dev.CLK_SET(LOW);
|
||||
}
|
||||
|
||||
//结束信号
|
||||
static inline void iic_Stop(HW_Dev_IIC dev) {
|
||||
dev.SDA_MODE(OUT);
|
||||
dev.CLK_SET(LOW);
|
||||
dev.SDA_SET(LOW);DELAY1US();
|
||||
dev.CLK_SET(HIGH);
|
||||
dev.SDA_SET(HIGH);
|
||||
}
|
||||
|
||||
//等待信号响应
|
||||
static inline uint8_t iic_WaitAck(HW_Dev_IIC dev, uint16_t timeout) {
|
||||
uint16_t time = 0;
|
||||
dev.SDA_MODE(IN);
|
||||
dev.SDA_SET(HIGH);DELAY1US();
|
||||
dev.CLK_SET(HIGH);DELAY1US();
|
||||
while (dev.SDA) {
|
||||
time++;DELAY1US();
|
||||
if (time > timeout) {
|
||||
iic_Stop(dev);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
dev.CLK_SET(LOW);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void iic_Ack(HW_Dev_IIC dev) {
|
||||
dev.CLK_SET(LOW);
|
||||
dev.SDA_MODE(OUT);
|
||||
dev.SDA_SET(LOW);DELAY1US();DELAY1US();
|
||||
dev.CLK_SET(HIGH);DELAY1US();DELAY1US();
|
||||
dev.CLK_SET(LOW);
|
||||
}
|
||||
|
||||
static inline void iic_NAck(HW_Dev_IIC dev) {
|
||||
dev.CLK_SET(LOW);
|
||||
dev.SDA_MODE(OUT);
|
||||
dev.SDA_SET(HIGH);DELAY1US();DELAY1US();
|
||||
dev.CLK_SET(HIGH);DELAY1US();DELAY1US();
|
||||
dev.CLK_SET(LOW);
|
||||
}
|
||||
|
||||
//写入一个字节
|
||||
static inline void iic_W(HW_Dev_IIC dev, uint8_t date) {
|
||||
dev.SDA_MODE(OUT);
|
||||
uint8_t i;
|
||||
for (i = 0; i < 8; i++) {
|
||||
dev.CLK_SET(LOW);
|
||||
if (date & 0x80) {
|
||||
dev.SDA_SET(HIGH);
|
||||
} else {
|
||||
dev.SDA_SET(LOW);
|
||||
}DELAY1US();DELAY1US();
|
||||
dev.CLK_SET(HIGH);DELAY1US();DELAY1US();
|
||||
dev.CLK_SET(LOW);DELAY1US();DELAY1US();
|
||||
date <<= 1;
|
||||
}
|
||||
}
|
||||
|
||||
static inline uint8_t iic_R(HW_Dev_IIC dev, uint8_t ack) {
|
||||
unsigned char i, read = 0;
|
||||
dev.SDA_MODE(IN);
|
||||
for (i = 0; i < 8; i++) {
|
||||
dev.CLK_SET(LOW);DELAY1US();DELAY1US();
|
||||
dev.CLK_SET(HIGH);
|
||||
read <<= 1;
|
||||
if (dev.SDA)read++;DELAY1US();
|
||||
}
|
||||
if (ack)
|
||||
iic_Ack(dev); //发送ACK
|
||||
else
|
||||
iic_NAck(dev); //发送NACK
|
||||
return read;
|
||||
}
|
||||
|
||||
void HW_IIC_WL(HW_Dev_IIC Dev, uint8_t InternalAddress, uint8_t *Write_Data, uint32_t Len) {
|
||||
iic_Start(Dev);
|
||||
iic_W(Dev, Dev.ADD);
|
||||
iic_WaitAck(Dev, 200);
|
||||
iic_W(Dev, InternalAddress);
|
||||
iic_WaitAck(Dev, 200);
|
||||
for (uint32_t i = 0; i < Len; i++) {
|
||||
iic_W(Dev, Write_Data[i]);
|
||||
iic_WaitAck(Dev, 200);
|
||||
}
|
||||
iic_Stop(Dev);
|
||||
}
|
||||
|
||||
void HW_IIC_RL(HW_Dev_IIC Dev, uint8_t InternalAddress, uint8_t *Read_Data, uint32_t Len, uint8_t Ack) {
|
||||
iic_Start(Dev);
|
||||
iic_W(Dev, Dev.ADD);
|
||||
iic_WaitAck(Dev, 200);
|
||||
iic_W(Dev, InternalAddress);
|
||||
iic_WaitAck(Dev, 200);
|
||||
for (uint32_t i = 0; i < Len; i++) {
|
||||
Read_Data[i] = iic_R(Dev, Ack);
|
||||
}
|
||||
iic_Stop(Dev);
|
||||
}
|
|
@ -0,0 +1,224 @@
|
|||
#include "spi.h"
|
||||
#include "tool.h"
|
||||
|
||||
#define CS_ENABLE() Dev.CS ? Dev.CS_SET(HIGH) : Dev.CS_SET(LOW)
|
||||
#define CS_DISABLE() Dev.CS ? Dev.CS_SET(LOW) : Dev.CS_SET(HIGH)
|
||||
|
||||
static inline uint8_t spi_RW(HW_Dev_Spi Dev, uint8_t Write_Date) {
|
||||
uint8_t i, read_date = 0;
|
||||
switch (Dev.MODE) {
|
||||
case Mode0:
|
||||
for (i = 0; i < 8; i++) {
|
||||
if (Write_Date & 0x80)
|
||||
Dev.MOSI_SET(HIGH);
|
||||
else
|
||||
Dev.MOSI_SET(LOW);
|
||||
Write_Date <<= 1;DELAY1US();
|
||||
Dev.SCK_SET(HIGH);
|
||||
read_date <<= 1;
|
||||
if (Dev.MISO())
|
||||
read_date++;DELAY1US();
|
||||
Dev.SCK_SET(LOW);NOP();
|
||||
}
|
||||
break;
|
||||
case Mode1:
|
||||
for (i = 0; i < 8; i++) {
|
||||
Dev.SCK_SET(HIGH);
|
||||
if (Write_Date & 0x80)
|
||||
Dev.MOSI_SET(HIGH);
|
||||
else
|
||||
Dev.MOSI_SET(LOW);
|
||||
Write_Date <<= 1;DELAY1US();
|
||||
Dev.SCK_SET(LOW);
|
||||
read_date <<= 1;
|
||||
if (Dev.MISO())
|
||||
read_date++;DELAY1US();
|
||||
}
|
||||
break;
|
||||
case Mode2:
|
||||
for (i = 0; i < 8; i++) {
|
||||
if (Write_Date & 0x80)
|
||||
Dev.MOSI_SET(HIGH);
|
||||
else
|
||||
Dev.MOSI_SET(LOW);
|
||||
Write_Date <<= 1;DELAY1US();
|
||||
Dev.SCK_SET(LOW);
|
||||
read_date <<= 1;
|
||||
if (Dev.MISO())
|
||||
read_date++;DELAY1US();
|
||||
Dev.SCK_SET(HIGH);
|
||||
}
|
||||
break;
|
||||
case Mode3:
|
||||
for (i = 0; i < 8; i++) {
|
||||
Dev.SCK_SET(LOW);
|
||||
if (Write_Date & 0x80)
|
||||
Dev.MOSI_SET(HIGH);
|
||||
else
|
||||
Dev.MOSI_SET(LOW);
|
||||
Write_Date <<= 1;DELAY1US();
|
||||
Dev.SCK_SET(HIGH);
|
||||
read_date <<= 1;
|
||||
if (Dev.MISO())
|
||||
read_date++;DELAY1US();NOP();
|
||||
}
|
||||
break;
|
||||
}
|
||||
return read_date;
|
||||
}
|
||||
|
||||
uint8_t HW_SPI_RW(HW_Dev_Spi Dev, uint8_t Write_Date) {
|
||||
uint8_t read_date;
|
||||
CS_ENABLE();
|
||||
read_date = spi_RW(Dev, Write_Date);
|
||||
CS_DISABLE();
|
||||
return read_date;
|
||||
}
|
||||
|
||||
void HW_SPI_WL(HW_Dev_Spi Dev, uint8_t *Write_Date, uint32_t Len) {
|
||||
CS_ENABLE();
|
||||
for (uint32_t i = 0; i < Len; i++)
|
||||
spi_RW(Dev, Write_Date[i]);
|
||||
CS_DISABLE();
|
||||
}
|
||||
|
||||
void HW_SPI_RL(HW_Dev_Spi Dev, uint8_t *Read_Date, uint32_t Len) {
|
||||
CS_ENABLE();
|
||||
for (uint32_t i = 0; i < Len; i++)
|
||||
Read_Date[i] = spi_RW(Dev, 0xFF);
|
||||
CS_DISABLE();
|
||||
}
|
||||
|
||||
void HW_SPI_RWL(HW_Dev_Spi Dev, uint8_t *Read_Date, uint8_t *Write_Date, uint32_t Len) {
|
||||
CS_ENABLE();
|
||||
for (uint32_t i = 0; i < Len; i++)
|
||||
Read_Date[i] = spi_RW(Dev, Write_Date[i]);
|
||||
CS_DISABLE();
|
||||
}
|
||||
|
||||
uint16_t HW_SPI_RW16(HW_Dev_Spi Dev, uint16_t Write_Date) {
|
||||
Data16 wdate16, rdate16;
|
||||
wdate16.u16 = Write_Date;
|
||||
CS_ENABLE();
|
||||
if (Dev.ENDIAN) {
|
||||
rdate16.u8[0] = spi_RW(Dev, wdate16.u8[0]);
|
||||
rdate16.u8[1] = spi_RW(Dev, wdate16.u8[1]);
|
||||
} else {
|
||||
rdate16.u8[0] = spi_RW(Dev, wdate16.u8[1]);
|
||||
rdate16.u8[1] = spi_RW(Dev, wdate16.u8[0]);
|
||||
}
|
||||
CS_DISABLE();
|
||||
return rdate16.u16;
|
||||
}
|
||||
|
||||
void HW_SPI_RL16(HW_Dev_Spi Dev, uint16_t *Read_Date, uint32_t Len) {
|
||||
Data16 rdate16;
|
||||
CS_ENABLE();
|
||||
switch (Dev.ENDIAN) {
|
||||
case LTL:
|
||||
for (uint32_t i = 0; i < Len; i++) {
|
||||
rdate16.u8[0] = spi_RW(Dev, 0xFF);
|
||||
rdate16.u8[1] = spi_RW(Dev, 0xFF);
|
||||
Read_Date[i] = rdate16.u16;
|
||||
}
|
||||
break;
|
||||
case LTB:
|
||||
for (uint32_t i = 0; i < Len; i++) {
|
||||
rdate16.u8[0] = spi_RW(Dev, 0xFF);
|
||||
rdate16.u8[1] = spi_RW(Dev, 0xFF);
|
||||
Read_Date[i] = rdate16.u16;
|
||||
}
|
||||
break;
|
||||
case BTB:
|
||||
for (uint32_t i = 0; i < Len; i++) {
|
||||
rdate16.u8[1] = spi_RW(Dev, 0xFF);
|
||||
rdate16.u8[0] = spi_RW(Dev, 0xFF);
|
||||
Read_Date[i] = rdate16.u16;
|
||||
}
|
||||
break;
|
||||
case BTL:
|
||||
for (uint32_t i = 0; i < Len; i++) {
|
||||
rdate16.u8[1] = spi_RW(Dev, 0xFF);
|
||||
rdate16.u8[0] = spi_RW(Dev, 0xFF);
|
||||
Read_Date[i] = rdate16.u16;
|
||||
}
|
||||
break;
|
||||
}
|
||||
CS_DISABLE();
|
||||
}
|
||||
|
||||
void HW_SPI_WL16(HW_Dev_Spi Dev, uint16_t *Write_Date, uint32_t Len) {
|
||||
Data16 wdate16;
|
||||
CS_ENABLE();
|
||||
switch (Dev.ENDIAN) {
|
||||
case LTL:
|
||||
for (uint32_t i = 0; i < Len; i++) {
|
||||
wdate16.u16 = Write_Date[i];
|
||||
spi_RW(Dev, wdate16.u8[0]);
|
||||
spi_RW(Dev, wdate16.u8[1]);
|
||||
}
|
||||
break;
|
||||
case LTB:
|
||||
for (uint32_t i = 0; i < Len; i++) {
|
||||
wdate16.u16 = Write_Date[i];
|
||||
spi_RW(Dev, wdate16.u8[1]);
|
||||
spi_RW(Dev, wdate16.u8[0]);
|
||||
}
|
||||
break;
|
||||
case BTB:
|
||||
for (uint32_t i = 0; i < Len; i++) {
|
||||
wdate16.u16 = Write_Date[i];
|
||||
spi_RW(Dev, wdate16.u8[1]);
|
||||
spi_RW(Dev, wdate16.u8[0]);
|
||||
}
|
||||
break;
|
||||
case BTL:
|
||||
for (uint32_t i = 0; i < Len; i++) {
|
||||
wdate16.u16 = Write_Date[i];
|
||||
spi_RW(Dev, wdate16.u8[0]);
|
||||
spi_RW(Dev, wdate16.u8[1]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
CS_DISABLE();
|
||||
}
|
||||
|
||||
void HW_SPI_RWL16(HW_Dev_Spi Dev, uint16_t *Read_Date, uint16_t *Write_Date, uint32_t Len) {
|
||||
Data16 wdate16, rdate16;
|
||||
CS_ENABLE();
|
||||
switch (Dev.ENDIAN) {
|
||||
case LTL:
|
||||
for (uint32_t i = 0; i < Len; i++) {
|
||||
wdate16.u16 = Write_Date[i];
|
||||
rdate16.u8[0] = spi_RW(Dev, wdate16.u8[0]);
|
||||
rdate16.u8[1] = spi_RW(Dev, wdate16.u8[1]);
|
||||
Read_Date[i] = rdate16.u16;
|
||||
}
|
||||
break;
|
||||
case LTB:
|
||||
for (uint32_t i = 0; i < Len; i++) {
|
||||
wdate16.u16 = Write_Date[i];
|
||||
rdate16.u8[0] = spi_RW(Dev, wdate16.u8[1]);
|
||||
rdate16.u8[1] = spi_RW(Dev, wdate16.u8[0]);
|
||||
Read_Date[i] = rdate16.u16;
|
||||
}
|
||||
break;
|
||||
case BTB:
|
||||
for (uint32_t i = 0; i < Len; i++) {
|
||||
wdate16.u16 = Write_Date[i];
|
||||
rdate16.u8[1] = spi_RW(Dev, wdate16.u8[1]);
|
||||
rdate16.u8[0] = spi_RW(Dev, wdate16.u8[0]);
|
||||
Read_Date[i] = rdate16.u16;
|
||||
}
|
||||
break;
|
||||
case BTL:
|
||||
for (uint32_t i = 0; i < Len; i++) {
|
||||
wdate16.u16 = Write_Date[i];
|
||||
rdate16.u8[1] = spi_RW(Dev, wdate16.u8[0]);
|
||||
rdate16.u8[0] = spi_RW(Dev, wdate16.u8[1]);
|
||||
Read_Date[i] = rdate16.u16;
|
||||
}
|
||||
break;
|
||||
}
|
||||
CS_DISABLE();
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
//
|
||||
// Created by lydxh on 2024/5/9.
|
||||
//
|
||||
#include <stdio.h>
|
||||
#include "tool.h"
|
||||
|
||||
float Mapping(float val, float I_Min, float I_Max, float O_Min, float O_Max)
|
||||
{
|
||||
return(((val-I_Min)*((O_Max-O_Min)/(I_Max-I_Min)))+O_Min);
|
||||
}
|
||||
|
||||
void BufPrint(char *name,void *buf,unsigned char size,unsigned int len,unsigned char frame){
|
||||
printf("\n%s:\n",name);
|
||||
for (int i = 0; i < len; ++i) {
|
||||
if(i%frame==0&&i!=0) printf("\n");
|
||||
switch (size) {
|
||||
case 8:
|
||||
printf("%02x ",*((unsigned char*)buf + i));
|
||||
break;
|
||||
case 16:
|
||||
printf("%04x ",*((unsigned short *)buf + i));
|
||||
break;
|
||||
case 32:
|
||||
printf("%08x ",*((unsigned int *)buf + i));
|
||||
break;
|
||||
default:
|
||||
printf("未指定类型大小");
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue