200 lines
3.3 KiB
C
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
|
|
|
|
|
|
|