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

📄 spi.h

📁 dds->9954的pcb供大家参考,这个扳子我调通了的可以放心开办
💻 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 + -