原创 使用LPC2103的SPI口的c程序

2008-10-25 17:57 3114 11 11 分类: MCU/ 嵌入式

对初学者来说可以参考一下编程的风格。主要用于通过单片机的SPI口读写U盘上的文件。


//============================================================================================================
//
//
// 本单元的功能描述:
//
//   实现 通过UART1 传输数据的功能。
//
//
// 输出函数列表:
//
//   UART1_Init  初始化
//   UART1_Send  发送数据
//===========================================================================================================
// 日期 | 动作 |    单位        | 描述   |联系方式
//===========================================================================================================
//2008-07-28| 创建  |  西安达泰电子   | 创建文件  |029-85272421  http://www.dataie.com
//============================================================================================================


//============================================================================================================
//  引入头文件
//============================================================================================================
//#include <LPC23xx.h>                        /* LPC23xx definitions */


#include "Config.h"
#include "IRQ_Unit.h"
#include "SPI_unit.h"


//============================================================================================================
//定义一些常量
BYTE* vSPI_RD_pData;
WORD vSPI_ReadLength;
WORD vSPI_ReadCounter;
DWORD vSPI_FirstData;
//============================================================================================================


 


//============================================================================================================
//************************************************************************************************************
//*
//*
//*   开始定义 处理UART中断、实施数据传输的 函数。
//*
//*
//************************************************************************************************************
//============================================================================================================
//函数名:  SPI_Handler
//
//调用关系: 被 硬件中断 调用。
//
//功能描述: SPI1的中断处理程序。
//
//入口参数: 无。
//
//返回值:  无。
//============================================================================================================
void SPI_Handler (void) __irq
{
 WORD IntCond;
 volatile BYTE Dummy;


 IntCond = SSPMIS;
 if ( IntCond & SSPMIS_RORMIS ) /* Receive overrun interrupt */
 {
  SSPICR = SSPICR_RORIC;  /* clear interrupt */
 }
 if ( IntCond & SSPMIS_RTMIS ) /* Receive timeout interrupt */
 {
  SSPICR = SSPICR_RTIC;  /* clear interrupt */
 }


    VICVectAddr = 0;  // Acknowledge Interrupt
}
//============================================================================================================
//************************************************************************************************************
//*
//*
//*   开始定义 本单元的外部接口函数 函数。
//*
//*
//************************************************************************************************************
//============================================================================================================
//函数名:  SPI_Init
//
//调用关系: 被 外部函数 函数调用。
//
//功能描述: SPI1的初始化程序。
//
//入口参数: 无
//
//返回值:  无。
//============================================================================================================
BOOL SPI_Init( void )
{


 PINSEL0 |= 0x20000000;       /* SCK1 */
 PINSEL1 |= 0x00000540;       /* SSEL1,MOSI1,MOSI1 */


 vSPI_ReadCounter = 0;
 
 // enable clock to SSP1 for security reason. By default, it's enabled already
 PCONP |= (1 << 10);


 //Set DSS data to 8-bit, Frame format SPI, CPOL = 0, CPHA = 0, and SCR is 15
 SSPCR0 = 0x0107;


 // SSPCPSR clock prescale register, minimum divisor is 0x02 in master mode
 SSPCPSR = 0x4;


 //IRQ_SetInt( cIRQ_SPI1, 1, (DWORD)SPI_Handler );
 
 // Device select as master, SSP Enabled
 SSPCR1 = SSPCR1_SSE;
 //* Set SSPINMS registers to enable interrupts */
 //* enable all error related interrupts */
 SSPIMSC = 0;//SSPIMSC_RORIM | SSPIMSC_RTIM;


 return TRUE;
}
//============================================================================================================
//函数名:  SPI_Send
//
//调用关系: 被 外部函数 函数调用。
//
//功能描述: 设置发送数据缓冲区的指针,然后,填写第一次的THR,以后的数据都在中断服务程序中被填写到THR、发送。
//
//入口参数: pBufStart 发送缓冲区的起始位置。
//    DataLength 需要发送的数据长度。
//
//返回值:  无。
//============================================================================================================
BOOL SPI_Send(void* pBufStart, DWORD DataLength)
{
 BYTE* pData;


 pData = pBufStart;
 while (DataLength)
 {
  if (SSPSR & SSPSR_TNF)
  {
   SSPDR = *pData;
   pData++;
   DataLength--;
  }
 }
 return TRUE;
}
//============================================================================================================
//函数名:  SPI_CanSendNextPacket
//
//调用关系: 被 外部函数 函数调用。
//
//功能描述: 查询是否可以发送下一个数据包。
//
//入口参数: 无
//
//返回值:  如果写指针等于发送数据传冲区结束位置,则返回真;否则返回假。
//============================================================================================================
BOOL SPI_CanSendNextPacket(void)
{
 return TRUE;
}
//============================================================================================================
//函数名:  SPI_StartRead
//
//调用关系: 被 外部函数 函数调用。
//
//功能描述: 启动读数据过程。
//
//入口参数: pBufStart 发送缓冲区的起始位置。
//    DataLength 需要接收的数据长度。
//
//返回值:  无。
//============================================================================================================
void SPI_StartRead(void* pBufStart, DWORD DataLength, DWORD FirstData)
{
 vSPI_RD_pData = pBufStart;
 vSPI_ReadLength = DataLength;
 vSPI_ReadCounter = 0;
 vSPI_FirstData = FirstData;
 
 while (SSPSR & SSPSR_RNE)
 {
  *vSPI_RD_pData = SSPDR;
 }
}
//============================================================================================================
//函数名:  SPI_GetReadCounter
//
//调用关系: 被 外部函数 函数调用。
//
//功能描述: 查询读了多少个数据。
//
//入口参数: 无
//
//返回值:  读了多少个数据。
//============================================================================================================
DWORD SPI_GetReadCounter(void)
{
 DWORD i;


 for (i=0; i<4; i++)
 {
  SSPDR = 0xFFFF;
 }


 while ((SSPSR & SSPSR_RNE) && (vSPI_ReadCounter < vSPI_ReadLength))
 {
  *vSPI_RD_pData = SSPDR;
  if ((vSPI_ReadCounter == 0) && (*vSPI_RD_pData != vSPI_FirstData))
  {
   if (*vSPI_RD_pData != 0x34)
   {
    *vSPI_RD_pData = vSPI_FirstData;
   }
   continue;
  }
  vSPI_ReadCounter++;
  vSPI_RD_pData++;
 }
 return vSPI_ReadCounter;
}
//============================================================================================================
//函数名:  SPI_CancelRead
//
//调用关系: 被 外部函数 函数调用。
//
//功能描述: 终止读数据过程。
//
//入口参数: 无
//
//返回值:  无。
//============================================================================================================
void SPI_CancelRead(void)
{
 vSPI_ReadCounter = 0;
 vSPI_ReadLength  = 0;
}
//============================================================================================================


 



//============================================================================================================
//
//   End of File
//
//================================================

文章评论0条评论)

登录后参与讨论
我要评论
0
11
关闭 站长推荐上一条 /2 下一条