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

📄 5045_io.c

📁 系统以MSP430F2274单片机为核心
💻 C
字号:
#include "msp430x22x4.h"

__no_init char data[20] @ 0x0400;     //数据存储首地址为0x0400
 

#define CSWDT_1 P1OUT |=BIT1
#define CSWDT_0  P1OUT &=~BIT1
#define DOUT_1   P3OUT |=BIT1
#define DOUT_0   P3OUT &=~BIT1
//#define DIN_1   P3IN & BIT2
#define SCK_1   P3OUT |=BIT3
#define SCK_0   P3OUT &=~BIT3

#define LED_1 P1OUT |=BIT3
#define LED_0 P1OUT &=~BIT3


unsigned char eeprom_data=0,rece_data=0,status=0;

void sys_init();
void delay_us(unsigned int k);
void X5045SpiOpen(void);
void X5045SpiClose(void);
void X5045WriteEnable(void);
void X5045SpiSend(unsigned char val);
void X5045ReadStatus();
//void X5045WriteStatus(unsigned char val);
void X5045SetTimer(void);
void X5045WriteWait(void);
void X5045ReadWord(unsigned int addr);
void X5045ReadByte(unsigned int addr);
void X5045WriteWord(unsigned int addr, unsigned int val);
void X5045WriteByte(unsigned int addr, unsigned char val);


void  main( void )
{
  
  sys_init();
  X5045SetTimer();
  delay_us(10000);
  X5045ReadStatus();
  unsigned int addr=0x0003;
  //unsigned char datain=0x99;
   unsigned int datain=0x1813;
  //X5045WriteByte(addr, datain);
  //X5045ReadByte(addr);
  X5045WriteWord(addr, datain);
  X5045ReadWord(addr);
  
}

void sys_init()
{
  WDTCTL  =WDTPW+WDTHOLD;                   //关闭看门狗
  BCSCTL1 =CALBC1_1MHZ;                     //设定DCO为1MHZ
  DCOCTL  =CALDCO_1MHZ;
  
   volatile unsigned int n;
 /* do                                      //等待晶振稳定
  {
    IFG1 &=~OFIFG;
    for(n=5000;n>0;n--);
  }  while(OFIFG&IFG1);  */
  for(n=5000;n>0;n--);
    
  P3DIR |=BIT1+BIT3;                        //IO口初始化,P3.1--SIMO,P3.2--SOMI,P3.3--SCK
  P1DIR |=BIT1+BIT3;                        //P1.1--CS_WDT,P1.3--LED
  P1OUT |=BIT1;
  P1OUT &=~BIT3;
}

void delay_us(unsigned int k)
{
  unsigned j;
  for(j=k;j>0;j--)
  {
    _NOP();
  }
}


/*--------------------------------------
     打开X5045片选
--------------------------------------*/
void X5045SpiOpen(void)
{
  CSWDT_1;     //关闭X5045片选CS
  SCK_0;
  P3OUT |=BIT2;
  DOUT_1;      //SO=SI=1,释放总线
  
  CSWDT_0;//WDT;打开X5045片选CS
}
/*--------------------------------------
    关闭X5045片选
--------------------------------------*/
void X5045SpiClose(void)
{
  CSWDT_1;      //关闭X5045片选CS
  P3OUT |=BIT2;
  DOUT_1;        //SO=SI=1,释放总线
  SCK_0;
}

/*--------------------------------------
    软件使能X5045写操作
--------------------------------------*/

void X5045WriteEnable(void)
{
  X5045SpiOpen();//打开X5045片选
  X5045SpiSend(0x06);//发送使能X5045写命令
  X5045SpiClose();      //
  X5045SpiOpen();
  
}


/*--------------------------------------
    X5045收发SPI协议
--------------------------------------*/
void  X5045SpiSend(unsigned char val)
{
  unsigned char i,x=0;
  //send_data=val;
  //P3OUT &=~BIT1;
  rece_data=0x00;
  for (i = 0; i < 8; i ++)
  {
    if(0x04&P3IN)            //如果P3.2=1,X=1
       x =0x01;
    else
       x =0x00;
    
    
    if(0x80&val)            //从低到高,依次送出各位



    
        DOUT_1;             //P3.1 
    else
   
        DOUT_0;
    
   
    SCK_1;                  //时钟置高
    _NOP();
    SCK_0;                  //时钟置低
    
    rece_data |=(x<<(7-i)); 
    val=val<<1;             
    
  }
   
  data[0]=rece_data;
  
}






/*--------------------------------------
    读X5045状态
--------------------------------------*/
void X5045ReadStatus(void)
{
  
  X5045SpiOpen();       //打开X5045片选
  X5045SpiSend(0x05);   //发送读X5045状态命令
  
  X5045SpiSend(0xff);   //接收X5045状态数据
  status=rece_data;
  X5045SpiClose();      //关闭X5045片选
 
}


/*--------------------------------------
    写X5045状态
--------------------------------------*/
void X5045WriteStatus(unsigned char val)
{
 
  X5045SpiOpen();//打开X5045片选
  X5045SpiSend(0x01);//发送写X5045状态命令
  X5045SpiSend(0x33);//发送X5045状态数据
  X5045SpiClose();//关闭X5045片选
}

/*--------------------------------------
    设置看门狗时间
--------------------------------------*/
void X5045SetTimer(void)//软件使能X5045写操作
{
	//unsigned char timer=0x33;
        //unsigned char value=0x01;
	
       
        X5045WriteEnable();
        X5045SpiOpen();
	X5045SpiSend(0x01);//写状态寄存器命令
	X5045SpiSend(0x04);//设置为200ms,同时将100h--1ffh段地址保护起来;
	X5045SpiClose();//关闭X5045片选
	
}

/*--------------------------------------
    等待X5045写入完成
--------------------------------------*/
void X5045WriteWait(void)
{	unsigned char status;
    do
	{
	X5045ReadStatus();
        status=rece_data;
	}
  	while (status & 0x01);//WIP=0 退出
}


/*--------------------------------------
    写X5045一个字节
--------------------------------------*/
void X5045WriteByte(unsigned int addr, unsigned char val)
{
  unsigned char temp;
  temp = 0x02;
  if ((addr >> 8) & 0x01) temp |= 8;
  X5045WriteEnable();//使能X5045写操作
  X5045SpiSend(temp);//发送X5045写命令及高位地址
  X5045SpiSend(addr);//发送X5045写低位地址
  X5045SpiSend(val);//发送X5045写数据
  
  X5045WriteWait();//等待本次X5045写入完成
  X5045SpiClose();//关闭X5045片选
}


/*--------------------------------------
    写X5045一个字
--------------------------------------*/
void X5045WriteWord(unsigned int addr, unsigned int val)

{
unsigned char temp;
  temp = 0x02;
  if ((addr >> 8) & 0x01) temp |= 8;
  X5045WriteEnable();//使能X5045写操作
  X5045SpiSend(temp);//发送X5045写命令及高位地址
  X5045SpiSend(addr);//发送X5045写低位地址
  X5045SpiSend(val & 0xff);//发送X5045写低位数据
  X5045SpiSend(val >> 8);//发送X5045写高位数据
  X5045SpiClose();//关闭X5045片选
  X5045WriteWait();//等待本次X5045写入完成

}

/*--------------------------------------
    读X5045一个字节
--------------------------------------*/
void X5045ReadByte(unsigned int addr)

{
  unsigned char val;
  X5045SpiOpen();//打开X5045片选
  val = 0x03;
  if ((addr >> 8) & 0x01) val |= 8;
  X5045SpiSend(val);//发送X5045读命令及高位地址
  X5045SpiSend(addr&0xff);//发送X5045读低位地址
  X5045SpiSend(0xff);//接收X5045读数据
  eeprom_data=rece_data;
  X5045WriteWait();//等待本次X5045写入完成
  X5045SpiClose();//关闭X5045片选
  
}

/*--------------------------------------
    读X5045一个字
--------------------------------------*/
void X5045ReadWord(unsigned int addr)

{
  unsigned char val;
  X5045SpiOpen();//打开X5045片选
  val = 0x03;
  if ((addr >> 8) & 0x01) val |= 8;
  X5045SpiSend(val);//发送X5045读命令及高位地址
  X5045SpiSend(addr & 0xff);//发送X5045读低位地址
  X5045SpiSend(0xff);//接收X5045读低位数据
  X5045SpiSend(0xff);//接收X5045读高位数据
  X5045SpiClose();//关闭X5045片选
  addr <<= 8;
  addr |= val;
  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -