📄 spi.c
字号:
/*****************************************************************************
* SPI.c: Fast I/O module file for NXP LPC24xx Family Microprocessors
*
* Copyright(C) 2006, NXP Semiconductor
* All rights reserved.
*
* History
* 2007.12.28 ver 1.00 Prelimnary version, first Release
*
******************************************************************************/
#include "LPC2468.h" /* LPC24xx definitions */
#include "type.h"
#include "irq.h"
#include "timer.h"
#include "SPI.h"
#include "target.h"
BYTE seg_buf[7];
/*
SPI测试数码管函数
*/
/*****************************************************************************
** Function name: SpI_Init
**
** Descriptions: initialize SPI port
**
** parameters: fdiv设置SPI工作频率
**
** Returned value: None
**
*****************************************************************************/
void SPI_Init(char fdiv)
{
PINSEL0 |= 0xc0000000; // 引脚配置
PINSEL1 |= 0x3c;
FIO0MASK = 0xffffbfff; // FIO屏蔽和方向设置
FIO0DIR = 0x4000;
if(fdiv < 8) fdiv = 8; // 速率最高为Fpclk八分频
S0SPCCR = fdiv & 0xFE;
S0SPCR = SPI_MODE;
}
/*****************************************************************************
** Function name: MSendData
**
** Descriptions: 向SPI端口传送一个字节数据
**
** parameters: data
**
** Returned value: None
**
*****************************************************************************/
char MSendData(char data)
{
FIO0CLR = 0x4000;
S0SPDR = data;
while(0==(S0SPSR&0x80));
FIO0SET = 0x4000;
return(S0SPDR);
}
/*****************************************************************************
** Function name: SegDisplay
**
** Descriptions: 单个数码管显示数字0~9
**
** parameters: data显示数字,
** segnum需要显示数码管编号
** Returned value: None
**
*****************************************************************************/
void SegDisplay(BYTE data,BYTE segnum)
{
char word[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; // 七段数码管的0~9数字编码
if(segnum > 6)
return;
if(data > 9)data %= 10;
FIO3PIN = segnum << 19;
MSendData(word[data]);
}
/******************************************************************************
** Function name: Timer2Handler
**
** Descriptions: Timer2中断服务函数,刷新六个数码管的显示
**
** parameters: None
** Returned value: None
**
******************************************************************************/
__irq __arm void Timer2Handler (void)
{
unsigned int i,j;
T2IR = 1; /* clear interrupt flag */
__enable_interrupt(); /* handles nested interrupt */
for(i=1;i<7;i++)
{
SegDisplay(seg_buf[i],i);
if(i<6)delayMs(0,4); // 节省最后一个管的延时时间
// for(j=0;j<30000;j++)j=j; // 作实验测出的合适的延时时间
}
__disable_interrupt();
VICVectAddr = 0; /* Acknowledge Interrupt */
}
/*****************************************************************************
** Function name: Seg_Init
**
** Descriptions: 数码管初始化,利用Timer2定时刷新数码管的显示数据
**
** parameters: refresh 刷新时间,单位为毫秒
** Returned value: None
**
*****************************************************************************/
//DWORD Seg_Init( BYTE refresh )
DWORD Seg_Init(void)
{
PCONP |= (1 << 22); // 使用Timer2
// T2MR0 = refresh*(Fpclk/1000) - 1; // 设置计时初值,计数pclk脉冲个数
T2MR0 = 23*(Fpclk/1000) - 1; // 20ms刷新一次数码管
T2MCR = 3; // 计数器的值与MR值匹配时的动作:发生中断、TC复位
T2TCR = 1; // Timer2使能
if ( install_irq( TIMER2_INT, (void *)Timer2Handler, HIGHEST_PRIORITY ) == FALSE )
{
return (FALSE);
}
return (TRUE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -