对初学者来说可以参考一下编程的风格。主要用于通过单片机的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条评论)
登录后参与讨论