📄 spi.c
字号:
#include "Sys_Define.h"
#define PCLK 0x00000001
#define PCSN 0x00008000
#define PSO 0x00001000
#define PSI 0x00000800
#define P_SPI_MODE_CTRL (volatile unsigned int*)(0x88110000)
#define P_NAND_GPIO_SETUP (volatile unsigned int*)(0x8820002C)
#define P_NAND_GPIO_PULL (volatile unsigned int*)(0x88200030)
#define P_SPI_INTERFACE_SEL (volatile unsigned int*)(0x882000a4)
#define P_NAND_GPIO_INPUT (volatile unsigned int*)(0x8820006c)
void delay( U16 time )
{
U16 i;
for(i=0;i<time;i++);
}
//以下为使用软件模拟SPI时序方式实现SPI的代码
///////////////////////////////////////////////////////////////////////////////////////////////////////////
/****************************************************************************************
* Function:
* Description: 初始化SPI接口,用软件模拟时序方式实现SPI
* Syntax:
* Modify:
* parameter: 无
* Returns: 无
* Notes:
****************************************************************************************/
void InitSPI() //初始化SPI
{
*P_SPI_INTERFACE_SEL &= ~0x00000100; //禁能SPI
*P_SPI_MODE_CTRL = 0x0; //禁能
*P_NAND_GPIO_PULL |= 0x00009801;
*P_NAND_GPIO_SETUP |= 0x90018000;
*P_NAND_GPIO_SETUP &= ~0x08000000;
}
/****************************************************************************************
* Function:
* Description: 信号线上发送1字节数据
* Syntax:
* Modify:
* parameter: U8 ucData 要发送的1字节数据
* Returns: 无
* Notes:
****************************************************************************************/
void putSPIchar(char ucData)
{
U8 i;
*P_NAND_GPIO_SETUP &= ~PCLK; //时钟线置0
for(i=8;i>0;)
{
i--;
if( (ucData>>i) & 0x01 )
{
*P_NAND_GPIO_SETUP |= PSO;
}
else
{
*P_NAND_GPIO_SETUP &= ~PSO;
}
delay(80); //60
*P_NAND_GPIO_SETUP |= PCLK;
delay(80);
*P_NAND_GPIO_SETUP &= ~PCLK;
}
}
/****************************************************************************************
* Function:
* Description: 信号线上接收1字节数据
* Syntax:
* Modify:
* parameter: 无
* Returns: 接收到的数据
* Notes:
****************************************************************************************/
U8 SPI_RB()
{
U8 i,ucRxData;
*P_NAND_GPIO_SETUP &= ~PCLK; //时钟线置0
for(i=8;i>0;i--)
{
delay(10);
ucRxData <<=1;
*P_NAND_GPIO_SETUP |= PCLK;
if( (*P_NAND_GPIO_INPUT) & PSI )
{
ucRxData |= 1;
}
delay(10);
*P_NAND_GPIO_SETUP &= ~PCLK;
}
return ucRxData;
}
/****************************************************************************************
* Function:
* Description: SPI短地址写,即地址为1字节,写入的数据为1字节
* Syntax:
* Modify:
* parameter: U8 Address:需要写入的寄存器地址
U8 *DataPtr:需要写入的数据的指针
* Returns: 无
* Notes:
****************************************************************************************/
void putSPIchar2(U8 Address, U8 Data)
{
*P_NAND_GPIO_SETUP &= ~PCSN; //使能线置0
delay(10);
putSPIchar(Address);
putSPIchar(Data);
*P_NAND_GPIO_SETUP |= PCSN; //使能线置1
}
/****************************************************************************************
* Function:
* Description: SPI短地址读,即地址为1字节,读出的数据为1字节
* Syntax:
* Modify:
* parameter: U8 Address:需要读的寄存器地址
U8 *DataPtr:读出的数据存放的指针
* Returns: 无
* Notes:
****************************************************************************************/
unsigned char getSPIchar(unsigned char Address)
{
unsigned char Data;
*P_NAND_GPIO_SETUP &= ~PCSN; //使能线置0
delay(10);
putSPIchar(Address);
Data = SPI_RB();
*P_NAND_GPIO_SETUP |= PCSN; //使能线置1
return Data;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -