📄 spi.h
字号:
#include "MSP430x16x.h"
#define SPIE_P64 (P6OUT)
#define SPIE_P65 (P6OUT)
#define SPISDI_P51 (P5OUT)
#define SPISDO_P52 (P5OUT)
#define SPISCL_P53 (P5OUT)
void SPI_Write9954();
void SPI_WriteOne9954();
void SPI_Write1305();
void SPI_Read1305();
void SetTimerInterrupt(unsigned char Hour,unsigned char Minute,unsigned char Second);
/*将此句添加到主函数中 TimeData表示调用Read1305函数是改变的公有变量
unsigned char TimeData;
uchar ReadSecond=0x00;
uchar ReadMinute=0x01;*/
//初始化SPI P2。0到2。4口用于9954的控制引脚
void InitSPI9954(void)
{
unsigned int i;
UCTL1 = SWRST; //serst 为控制位,当它等于1时设置串口,然后设置它为0。最后如果需要中断,设置相应中断使能。
UCTL1 |= CHAR + SYNC + MM; //char 设定字符长度8位;sync 设定SPI模式 ;MM 设定主机模式
UTCTL1 = CKPL + STC + SSEL1+SSEL0;// //STC 3线模式,用于避免总线冲突的STE线不起作用。 SSEL1 辅助时钟ACLK
//UTCTL1 |= CKPL;
UBR01= 0X01; //波特率选择因子
UBR11 = 0X00; //波特率选择因子
UMCTL1 = 0; //波特率调整控制寄存器,不需要调整时写零
// ME1 |= UTXE1; //发送模块使能
ME2 |= UTXE1; //发送模块使能
UCTL1 &=~ SWRST;
//IE2 |= URXIE1; //打开接受中断8y 8
P6SEL &= ~BIT5; //设置使能端口
P6DIR |=BIT5;
P6OUT|=BIT5;
P2SEL&=~0x1f;
P2DIR|=0x1f;
P2OUT &= ~BIT3; // PS0
P2OUT &=~BIT0;//IOupDAta low
P2OUT |= BIT1; //复位
for(i=0;i<10000;i++);
P2OUT &= ~BIT1;
P2OUT|= BIT2; //sync
for(i=0;i<1000;i++);
P2OUT&= ~BIT2;
P2OUT &= ~BIT4; //PS1
// for(i=0;i<400;i++);
// P2OUT |= BIT4;
}
void InitSPI1305(void)
{
UCTL1 = SWRST; //serst 为控制位,当它等于1时设置串口,然后设置它为0。最后如果需要中断,设置相应中断使能。
UCTL1 |= CHAR + SYNC + MM; //char 设定字符长度8位;sync 设定SPI模式 ;MM 设定主机模式
UTCTL1 = STC + SSEL0; //STC 3线模式,用于避免总线冲突的STE线不起作用。
UBR01= 0X08; //波特率选择因子
UBR11 = 0X00; //波特率选择因子
UMCTL1 = 0; //波特率调整控制寄存器,不需要调整时写零
ME2 |= URXE1+UTXE1; //接受和发送模块使能
UCTL1 &=~ SWRST;
IE2 |= URXIE1; //打开接受中断
P6SEL &= ~0x10; //设置使能端口
P6DIR |=0x10;SPI_Write1305(0x8f,0x05); //开INT0中断
}
//向SPI芯片9954写数据
void SPI_Write9954(adr,dat)
{
unsigned int i;
//P2OUT&=~BIT0; //IOupDAta low
P5OUT=0x00;
P5SEL=0x00e;
P5DIR|=0x01;
SPIE_P65 &=~ BIT5; //CE脚置低电平
//while((UTCTL1 & 0x01)==0);
//for(i=0;i<1000;i+=1) ;
TXBUF1=adr;
while((UTCTL1 & 0x01)==0);
//for(i=0;i<100;i+=1) ;
TXBUF1=dat;
while((UTCTL1 & 0x01)==0); //是否发送完毕
SPIE_P65 |= BIT5; //CE脚置高电平
//for(i=0;i<1000;i+=1) ;
P5SEL=0x00;
//P2OUT|=BIT0; //IOupDAta High
}
//向SPI芯片9954写一个字节
void SPI_WriteOne9954(dat)
{
unsigned int i;
//P2OUT&=~BIT0; //IOupDAta low
P5OUT=0x00;
P5SEL=0x00e;
P5DIR|=0x01;
SPIE_P65 &=~ BIT5; //CE脚置低电平
//while((UTCTL1 & 0x01)==0);
//for(i=0;i<1000;i+=1) ;
TXBUF1=dat;
while((UTCTL1 & 0x01)==0);
// for(i=0;i<100;i+=1) ; //是否发送完毕
SPIE_P65 |= BIT5; //CE脚置高电平
// for(i=0;i<1000;i+=1);
P5SEL=0x00;
//P2OUT|=BIT0; //IOupDAta High
}
//向1305时钟芯片写数据
void SPI_Write1305(adr,dat)
{
unsigned int i;
P5OUT=0x00;
P5SEL |= 0X0E;
P5DIR |= 0x0B;
P5DIR &=~ BIT2;
SPIE_P64 |= BIT4; //CE脚置高电平
for(i=0;i<1000;i+=1) ;
TXBUF1=adr;
while((UTCTL1 & 0x01)==0);
for(i=0;i<1000;i+=1) ;
TXBUF1= dat;
while((UTCTL1 & 0x01)==0); //是否发送完毕
SPIE_P64 &=~ BIT4; //CE脚置低电平
P5SEL &= ~0X0E;
P5DIR |= BIT2;
}
//从1305时钟芯片读数据 4.2口为CE
void SPI_Read1305(adr)
{
unsigned int i;
P5OUT=0x00;
P5SEL |= 0X0E;
P5DIR |= 0x0B;
P5DIR &=~ BIT2; //将p5.2置为输入
SPIE_P64 |= BIT4; //CE脚置高电平
for(i=0;i<1000;i+=1) ;
TXBUF1=adr;
while((UTCTL1 & 0x01)==0); //保持时钟信号
for(i=0;i<1000;i+=1) ;
TXBUF1=0x00;
while((UTCTL1 & 0x01)==0);
SPIE_P64 &=~ BIT4; //CE脚置低电平
P5DIR |= BIT2; //将p5.2置为输出
P5SEL &= ~0X0E;
}
/*
//SPI接受中断
#pragma vector=USART1RX_VECTOR
__interrupt void SPI1_rx (void)
{
//P5OUT ^= 0x010;
//while((IFG1 & URXIFG1)==0);
//if (shujuwei<7)
// {
// shujuwei= shujuwei +1;
//}
// else
// {
TimeData=RXBUF1;
P1OUT=data;
//shujuwei=0;
// }
}
*/
void SetTimerInterruptBCD(unsigned char Hour,unsigned char Minute,unsigned char Second)
{
InitSPI1305();
SPI_Write1305(0x87,Second);
SPI_Write1305(0x88,Minute);
SPI_Write1305(0x89,Hour);
SPI_Write1305(0x8A,0x80); //Alarm hours, minutes and seconds match
}
/*设置Timer的时间*/
void SetUpTimerBCD(unsigned char Hour,unsigned char Minute,unsigned char Second)
{
InitSPI1305();
SPI_Write1305(0x80,Second);
SPI_Write1305(0x81,Minute);
SPI_Write1305(0x82,Hour); //24hour mode
//SPI_Write1305(0x8A,0x80); //Alarm hours, minutes and seconds match
}
/*以下三个函数都要用到在主函数中声明的公有变量TimeData*/
/*
unsigned char Read1305Day(void)
{
InitSPI1305();
SPI_Read1305(0x03);
return TimeData;
}
unsigned char Read1305Hour(void)
{
InitSPI1305();
SPI_Read1305(0x02);
return TimeData;
}
unsigned char Read1305Minute(void)
{
InitSPI1305();
SPI_Read1305(0x01);
return TimeData;
}
unsigned char Read1305Second(void)
{
InitSPI1305();
SPI_Read1305(0x00);
return TimeData;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -