commit 97aa90ab4af561e6352eafce4b0f8097e79a8a63 Author: JiXieShi Date: Thu May 9 13:56:55 2024 +0800 Init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ff9047e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/cmake-build-debug/ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..ef67695 --- /dev/null +++ b/CMakeLists.txt @@ -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}) diff --git a/demo/spi/t_spi.h b/demo/spi/t_spi.h new file mode 100644 index 0000000..78d0b75 --- /dev/null +++ b/demo/spi/t_spi.h @@ -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 diff --git a/demo/spi/test.c b/demo/spi/test.c new file mode 100644 index 0000000..173a2a4 --- /dev/null +++ b/demo/spi/test.c @@ -0,0 +1,62 @@ +// +// Created by lydxh on 2024/4/8. +// +#include +#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); +} \ No newline at end of file diff --git a/lib/inc/iic/iic.h b/lib/inc/iic/iic.h new file mode 100644 index 0000000..e7f31d1 --- /dev/null +++ b/lib/inc/iic/iic.h @@ -0,0 +1,49 @@ +// +// Created by lydxh on 2024/5/9. +// + +#ifndef HW_LIB_IIC_H +#define HW_LIB_IIC_H + +#include + +#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 diff --git a/lib/inc/log/log.h b/lib/inc/log/log.h new file mode 100644 index 0000000..351579a --- /dev/null +++ b/lib/inc/log/log.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 +#include +#include +#else +#include +#include +#include +#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 \ No newline at end of file diff --git a/lib/inc/spi/spi.h b/lib/inc/spi/spi.h new file mode 100644 index 0000000..5d53959 --- /dev/null +++ b/lib/inc/spi/spi.h @@ -0,0 +1,119 @@ +// +// Created by lydxh on 2024/4/8. +// + +#ifndef HW_LIB_SPI_H +#define HW_LIB_SPI_H + +#include + +#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 diff --git a/lib/inc/tool.h b/lib/inc/tool.h new file mode 100644 index 0000000..c731b5a --- /dev/null +++ b/lib/inc/tool.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 diff --git a/lib/src/iic/iic.c b/lib/src/iic/iic.c new file mode 100644 index 0000000..b9c15c0 --- /dev/null +++ b/lib/src/iic/iic.c @@ -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); +} \ No newline at end of file diff --git a/lib/src/spi/spi.c b/lib/src/spi/spi.c new file mode 100644 index 0000000..9ef548d --- /dev/null +++ b/lib/src/spi/spi.c @@ -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(); +} \ No newline at end of file diff --git a/lib/src/tool.c b/lib/src/tool.c new file mode 100644 index 0000000..cff585d --- /dev/null +++ b/lib/src/tool.c @@ -0,0 +1,30 @@ +// +// Created by lydxh on 2024/5/9. +// +#include +#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("未指定类型大小"); + } + } +} \ No newline at end of file diff --git a/main.c b/main.c new file mode 100644 index 0000000..48b43f6 --- /dev/null +++ b/main.c @@ -0,0 +1,10 @@ +#include +#include +#include +#include "t_spi.h" +int main() { + srand((unsigned)time(NULL)); + printf("Hello, World!\n"); + Test_spi(); + return 0; +}