optical/NxBase/spirw.c
2025-09-04 09:45:08 +08:00

200 lines
3.3 KiB
C

#include "spirw.h"
#ifndef SOFT_SPI1
#define SOFT_SPI1 0
#endif
#ifndef SOFT_SPI2
#define SOFT_SPI2 0
#endif
#ifndef SOFT_SPI3
#define SOFT_SPI3 0
#endif
#ifndef SOFT_SPI4
#define SOFT_SPI4 0
#endif
#define SPIRW_PROC(spi) \
u8 g_spi##spi##InitFlag = 0; \
void InitSpi##spi(void) \
{ \
LL_SPI_Enable(SPI##spi); \
g_spi##spi##InitFlag = 1; \
} \
u8 IsSpi##spi##Inited(void) \
{ \
return g_spi##spi##InitFlag; \
} \
/* \
// 功能: SPI交换1个字节数据 \
// 参数: dat, 待发送的数据 \
// 返回: 读到的数据 \
// 说明: 无 \
*/ \
u8 Spi##spi##SwapByte(u8 dat) \
{ \
while (LL_SPI_IsActiveFlag_TXE(SPI##spi) == 0); /* 等待数据寄存器空 */ \
LL_SPI_TransmitData8(SPI##spi, dat); \
while (LL_SPI_IsActiveFlag_RXNE(SPI##spi) == 0); /* 等待发送完成--发送完成时接收也完成 */ \
return LL_SPI_ReceiveData8(SPI##spi); \
} \
\
/* 发送字节 */ \
void Spi##spi##WriteByte(u8 txData) \
{ \
Spi##spi##SwapByte(txData); \
} \
\
/* 接收字节 */ \
u8 Spi##spi##ReadByte(void) \
{ \
return Spi##spi##SwapByte(0xff); \
} \
/* \
// 功能: SPI交换1个字数据 \
// 参数: dat, 待发送的数据 \
// 返回: 读到的数据 \
// 说明: 无 \
*/ \
u16 Spi##spi##SwapWord(u16 dat) \
{ \
while (LL_SPI_IsActiveFlag_TXE(SPI##spi) == 0); /* 等待数据寄存器空 */ \
LL_SPI_TransmitData16(SPI##spi, dat); \
while (LL_SPI_IsActiveFlag_RXNE(SPI##spi) == 0); /* 等待发送完成--发送完成时接收也完成 */ \
return LL_SPI_ReceiveData16(SPI##spi); \
} \
\
/* 发送字 */ \
void Spi##spi##WriteWord(u16 txData) \
{ \
Spi##spi##SwapWord(txData); \
} \
\
/* 接收字 */ \
u16 Spi##spi##ReadWord(void) \
{ \
return Spi##spi##SwapWord(0xffff); \
} \
//------
#define SOFT_SPIRW_PROC(spi) \
u8 g_spi##spi##InitFlag = 0; \
void InitSpi##spi(void) \
{ \
g_spi##spi##InitFlag = 1; \
} \
u8 IsSpi##spi##Inited(void) \
{ \
return g_spi##spi##InitFlag; \
} \
/* \
// 功能: SPI交换1个字节数据 \
// 参数: dat, 待发送的数据 \
// 返回: 读到的数据 \
*/ \
u8 Spi##spi##SwapByte(u8 dat) \
{/* 软件模拟标准SPI,CLK上升沿读写数据 */ \
u8 rslt, mod; \
rslt = 0; \
mod = 0x80; \
\
Spi##spi##ClockLow(); \
\
for (int i = 0; i < 8; i++) \
{ \
/* 设置好数据 */ \
if ((dat & mod) != 0) \
{ \
Spi##spi##MdoWrite(DAT_ONE); \
} \
else \
{ \
Spi##spi##MdoWrite(DAT_ZERO); \
} \
/* 先准备好数据,再拉高CLK */ \
Spi##spi##ClockHigh(); \
\
if(Spi##spi##MdiRead() == DAT_ONE) /* 读取数据 */ \
{ \
rslt |= mod; \
} \
mod >>= 1; \
\
Spi##spi##ClockLow(); \
} \
return rslt; \
} \
\
/* 发送字节 */ \
void Spi##spi##WriteByte(u8 txData) \
{ \
Spi##spi##SwapByte(txData); \
} \
\
/* 接收字节 */ \
u8 Spi##spi##ReadByte(void) \
{ \
return Spi##spi##SwapByte(0xff); \
} \
/* \
// 功能: SPI交换1个字数据 \
// 参数: dat, 待发送的数据 \
// 返回: 读到的数据 \
*/ \
u16 Spi##spi##SwapWord(u16 dat) \
{ \
return 0;\
} \
\
/* 发送字 */ \
void Spi##spi##WriteWord(u16 txData) \
{ \
Spi##spi##SwapWord(txData); \
} \
\
/* 接收字 */ \
u16 Spi##spi##ReadWord(void) \
{ \
return Spi##spi##SwapWord(0xffff); \
} \
//------
//--------------------
#ifdef SRW_SPI1
#if (SOFT_SPI1 == 0)
SPIRW_PROC(1);
#else
SOFT_SPIRW_PROC(1);
#endif
#endif
#ifdef SRW_SPI2
#if (SOFT_SPI2 == 0)
SPIRW_PROC(2);
#else
SOFT_SPIRW_PROC(2);
#endif
#endif
#ifdef SRW_SPI3
#if (SOFT_SPI3 == 0)
SPIRW_PROC(3);
#else
SOFT_SPIRW_PROC(3);
#endif
#endif
#ifdef SRW_SPI4
#if (SOFT_SPI4 == 0)
SPIRW_PROC(4);
#else
SOFT_SPIRW_PROC(4);
#endif
#endif