⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi.txt

📁 基于LPC2131的SPI编程驱动,主机方式,查询方式
💻 TXT
字号:
#include  "config.h" 

#define   SLAVE_CS       1 << 29      	// P0.29口为SPI为从机的选择控制引脚
#define   LED1           1 << 18     	// P1.18控制LED1
#define   LED2           1 << 19     	// P1.19控制LED2

volatile uint8 	RcvData;			// 接收到的数据

/*
*********************************************************************************************************
** 函数名称:DelayNS()
** 函数功能:长软件延时
** 入口参数:dly	延时参数,值越大,延时越久
** 出口参数:无
*********************************************************************************************************
*/
void  DelayNS(uint32  dly)
{  
    uint32  i;

    for(; dly>0; dly--) 
        for(i=0; i<50000; i++);
}

/*
*********************************************************************************************************
** 函数名称 :SPI_Init()
** 函数功能 :初始化SPI接口,设置为从机。
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void  SPI_Init(void)
{  
	S0PCR  = (0 << 3)|				// CPHA = 0, 数据在SCK 的第一个时钟沿采样
 			(1 << 4) |				// CPOL = 1, SCK 为低有效
 			(0 << 5) |				// MSTR = 0, SPI 处于从模式
 			(0 << 6) |				// LSBF = 0, SPI 数据传输MSB (位7)在先
 			(1 << 7);				// SPIE = 1, SPI 中断被使能
}

/*
*********************************************************************************************************
** 函数名称 :SSP_Init()
** 函数功能 :将SSP控制器初始化SPI接口,设置为主机。
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void  SSP_Init(void)
{
    SSPCR0 = (0x01 << 8) |              // SCR  设置SPI时钟分频
             (0x00 << 7) |              // CPHA 时钟输出相位,仅SPI模式有效 
             (0x01 << 6) |              // CPOL 时钟输出极性,仅SPI模式有效
             (0x00 << 4) |              // FRF  帧格式 00=SPI,01=SSI,10=Microwire,11=保留
             (0x07 << 0);               // DSS  数据长度,0000-0010=保留,0011=4位,0111=8位,1111=16位

    SSPCR1 = (0x00 << 3) |              // SOD  从机输出禁能,1=禁止,0=允许
             (0x00 << 2) |              // MS   主从选择,0=主机,1=从机
             (0x01 << 1) |              // SSE  SSP使能,1=允许SSP与其它设备通信
             (0x00 << 0);               // LBM  回写模式
             
    SSPCPSR = 0x52;                     // PCLK分频值
  //  SSPIMSC = 0x07;                     // 中断屏蔽寄存器
    SSPICR  = 0x03;                     // 中断清除寄存器   
}

/*
*********************************************************************************************************
* 函数名称:SSP_SendData()
* 函数功能:SSP接口向SPI总线发送数据。
* 入口参数:data        待发送的数据
* 出口参数:返回值为读取的数据
*********************************************************************************************************
*/

uint8  SSP_SendData(uint8 data)
{  
    IO0CLR = SLAVE_CS;			        // 选择从机   
    SSPDR = data;
    while( (SSPSR & 0x01) == 0 );	    // 等待TFE置位,即发送FIFO空   
//    IO0SET = SLAVE_CS;				// 这里不能拉高,否则从机出现中止
    return(SSPDR);
}

/*
*********************************************************************************************************
* 函数名称:SPI_ReadData()
* 函数功能:SPI从机读取数据。
* 入口参数:无
* 出口参数:读取的数据
*********************************************************************************************************
*/
uint8 SPI_ReadData(void)
{
	while (0 == S0PSR & 0x80);
	
    IO0SET = SLAVE_CS;					// 在这里禁止片选
	return S0PDR;
}


/*
*********************************************************************************************************
** 函数名称:main()
** 函数功能:SPI从机实验。  
*********************************************************************************************************
*/
int main (void)
{  
    uint8  rcv_data; 
    uint8  i; 
	
    PINSEL0 = 0x00005500;			            // 设置SPI0管脚连接
    PINSEL1 = 0x000002A8;                       // 设置SSP管脚连接
    PINSEL2 = PINSEL2 & (~0x08);				// P1[25:16]连接GPIO
    IO0DIR  = SLAVE_CS;							// 从机片选
    IO0SET  = SLAVE_CS;							// 先设置从机片选无效
    IO1DIR  = LED1 | LED2;						// LED控制口
    IO1SET  = LED1 | LED2;

    SPI_Init();					                // 初始化SPI接口
    SSP_Init();                                 // 初始化SSP接口
    
    while(1)	
    {  
        for(i = 0; i < 8; i++)
        {
            rcv_data = SSP_SendData(i);  		// 发送数据
            DelayNS(100);	                    // 延时
            
            RcvData = SPI_ReadData();			// 从机读取数据
   	    	if(RcvData == i)
   	   	 	{	/* 接收的数据是否与发送的数据相同,LED1闪烁 */
    			IO1SET = LED2;				// 接收正确的时候LED2熄灭
   	     		IO1CLR = LED1;
   	     		DelayNS(10);
   	     		IO1SET = LED1;
   	    	}
   	    		/* 数据错误,LED1一直点亮 */
   	    	else IO1CLR = LED2;
        }
    }
 
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -