📄 spif.c
字号:
// Port -290 -3200
//PCLK---NF_ALE ---NF_ALE
//PCSN---SPICSN ---SPICSN
//PSO----NF_D4 ---NF_D4
//PSI----NF_D5 ---NF_D5
//RST----NF_D6 ---IOA1
//INT----IOA1 ---IOA0
#include ".\zigbee\unet.h"
#include "SPCE3200_Register.h"
#include "SPCE3200_Constant.h"
#define SPI_SIM //采用软件仿真还是硬件实现SPI
#define PCLK 0x00000001
#define PCSN 0x00008000
#define PSO 0x00001000
#define PSI 0x00000800
extern void _INT_ON();
extern void _INT_OFF();
void Delay( UINT16 time )
{
UINT16 i;
for(i=0;i<time;i++)
{
}
}
void ResetZB()
{
UINT8 i;
*P_IOA_GPIO_SETUP &= ~0x00000002; // IOA1复位输出0
for(i=0;i<255;i++);
*P_IOA_GPIO_SETUP |= 0x00000002; // IOA1复位输出1
}
void InitZB_interface()
{
*P_GPIO_CLK_CONF = 0x3;
// *P_CKG_CFG_SFT = 0x3;
// *P_NAND_GPIO_PULL |= 0x00002000; //初始化模块的复位控制脚
// *P_NAND_GPIO_SETUP |= 0x20002000;
*P_IOA_GPIO_SETUP = 0x00010200; // IOA0中断输入,IOA1复位输出
*P_IOA_GPIO_INT = 0x01010100; //设置下降沿中断
*P_INT_MASK_CTRL2 &= ~C_INT_GPIO_DIS;
ResetZB();
}
#ifdef SPI_SIM
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//以下为使用软件模拟SPI时序方式实现SPI的代码
///////////////////////////////////////////////////////////////////////////////////////////////////////////
/****************************************************************************************
* Function:
* Description: 初始化SPI接口,用软件模拟时序方式实现SPI
* Syntax:
* Modify:
* parameter: 无
* Returns: 无
* Notes:
* Date: 2007-02-27
* Author: ZijianWang
****************************************************************************************/
void InitSPI() //初始化SPI
{
*P_SD_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: UINT8 ucData 要发送的1字节数据
* Returns: 无
* Notes:
* Date: 2007-02-27
* Author: ZijianWang
****************************************************************************************/
void SPI_SB( UINT8 ucData )
{
UINT8 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(0);
*P_NAND_GPIO_SETUP |= PCLK;
Delay(0);
*P_NAND_GPIO_SETUP &= ~PCLK;
}
}
/****************************************************************************************
* Function:
* Description: 信号线上接收1字节数据
* Syntax:
* Modify:
* parameter: 无
* Returns: 接收到的数据
* Notes:
* Date: 2007-02-27
* Author: ZijianWang
****************************************************************************************/
UINT8 SPI_RB()
{
UINT8 i,ucRxData;
*P_NAND_GPIO_SETUP &= ~PCLK; //时钟线置0
for(i=8;i>0;i--)
{
Delay(0);
ucRxData <<=1;
*P_NAND_GPIO_SETUP |= PCLK;
if( (*P_NAND_GPIO_INPUT) & PSI )
{
ucRxData |= 1;
}
Delay(0);
*P_NAND_GPIO_SETUP &= ~PCLK;
}
return ucRxData;
}
/****************************************************************************************
* Function:
* Description: SPI短地址写,及地址为1字节,写入的数据为1字节
* Syntax:
* Modify:
* parameter: UINT8 Address:需要写入的寄存器地址
UINT8 *DataPtr:需要写入的数据的指针
* Returns: 无
* Notes:
* Date: 2007-02-27
* Author: ZijianWang
****************************************************************************************/
void spi_sw(UINT8 Address, UINT8 Value)
{
Address = (Address << 1) | 0x0001; //Shfit the Address
// _INT_OFF();
*P_NAND_GPIO_SETUP &= ~PCSN; //使能线置0
Delay(0);
SPI_SB(Address);
SPI_SB(Value);
*P_NAND_GPIO_SETUP |= PCSN; //使能线置1
// _INT_ON();
}
/****************************************************************************************
* Function:
* Description: SPI短地址读,及地址为1字节,读出的数据为1字节
* Syntax:
* Modify:
* parameter: UINT8 Address:需要读的寄存器地址
UINT8 *DataPtr:读出的数据存放的指针
* Returns: 无
* Notes:
* Date: 2007-02-27
* Author: ZijianWang
****************************************************************************************/
UINT8 spi_sr(UINT8 Address)
{
UINT8 Value;
Address = (Address << 1);
// _INT_OFF();
*P_NAND_GPIO_SETUP &= ~PCSN; //使能线置0
Delay(0);
SPI_SB(Address);
Value = SPI_RB();
*P_NAND_GPIO_SETUP |= PCSN; //使能线置1
// _INT_ON();
return Value;
}
/****************************************************************************************
* Function:
* Description: SPI长地址写,及地址为2字节,写入的数据为1字节
* Syntax:
* Modify:
* parameter: UINT8 Address:需要写入的寄存器地址
UINT8 *DataPtr:需要写入的数据的指针
* Returns: 无
* Notes:
* Date: 2007-02-27
* Author: ZijianWang
****************************************************************************************/
void spi_lw(UINT16 Address, UINT8 Value)
{
Address = (Address << 5) | 0x8010;
// _INT_OFF();
*P_NAND_GPIO_SETUP &= ~PCSN; //使能线置0
Delay(0);
SPI_SB(Address>>8);
SPI_SB(Address);
SPI_SB(Value);
*P_NAND_GPIO_SETUP |= PCSN; //使能线置1
// _INT_ON();
}
/****************************************************************************************
* Function:
* Description: SPI长地址读,及地址为2字节,读出的数据为1字节
* Syntax:
* Modify:
* parameter: UINT8 Address:需要读的寄存器地址
UINT8 *DataPtr:读出的数据存放的指针
* Returns: 无
* Notes:
* Date: 2007-02-27
* Author: ZijianWang
****************************************************************************************/
UINT8 spi_lr(UINT16 Address)
{
UINT8 Value;
Address = (Address << 5) | 0x8000;
// _INT_OFF();
*P_NAND_GPIO_SETUP &= ~PCSN; //使能线置0
Delay(0);
SPI_SB(Address>>8);
SPI_SB(Address);
Value = SPI_RB();
*P_NAND_GPIO_SETUP |= PCSN; //使能线置1
// _INT_ON();
return Value;
}
/****************************************************************************************
* Function:
* Description: SPI长地址多数据写,及地址为2字节,写入的数据为Length字节
* Syntax:
* Modify:
* parameter: UINT8 Address:需要写入的寄存器地址
UINT8 *DataPtr:需要写入的数据的指针
UINT8 Length: 需要写入的数据的长度
* Returns: 无
* Notes:
* Date: 2007-02-27
* Author: ZijianWang
****************************************************************************************/
void spi_fill_fifo(UINT16 Address, UINT8 *DataPtr, UINT8 Length)
{
Address = (Address << 5) | 0x8010;
// _INT_OFF();
*P_NAND_GPIO_SETUP &= ~PCSN; //使能线置0
Delay(0);
SPI_SB(Address>>8);
SPI_SB(Address);
while (Length--)
{
SPI_SB(*DataPtr);
DataPtr++;
}
*P_NAND_GPIO_SETUP |= PCSN; //使能线置1
// _INT_ON();
}
/****************************************************************************************
* Function:
* Description: SPI长地址多数据读,及地址为2字节,读出的数据为Length字节
* Syntax:
* Modify:
* parameter: UINT8 Address:需要读的寄存器地址
UINT8 *DataPtr:读出的数据存放的指针
UINT8 Length: 读出的数据长度
* Returns: 无
* Notes:
* Date: 2007-02-27
* Author: ZijianWang
****************************************************************************************/
void spi_dump_fifo(UINT16 Address, UINT8 *DataPtr, UINT8 Length)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -