📄 5045_io.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 + -