📄 msp430-45db041.c
字号:
#include "string.h"
#define RDY 0x80 //FLASH闲状态标志
int word;//发送字节缓存
int cmd_word;//发送命令缓存
unsigned int R_word;// 接收字节缓存
extern Time Copy_time;
extern Time Cur_time;
extern chuanganqi Cur_chuanganqi;
extern jiance Cur_jiance;
void Send_Byte(void)
{
int i;
int Tamp;
for (i=0;i<8;i++)
{
P5OUT &=~ BIT3; //SCK
Tamp = word;
Tamp &= 0x80;
if(!Tamp)
P5OUT &=~ BIT1;
else
P5OUT |= BIT1;
P5OUT |= BIT3; //SCK
word = word << 1;
}
}
void Send_Start(void)
{
P5DIR |= BIT1+BIT3;
word = cmd_word;
Send_Byte();
}
void Stop(void)
{
P5DIR &=~(BIT1+BIT2);
P5OUT |= BIT3;
P4DIR |= BIT4+BIT5+BIT6;
P4OUT |= BIT4+BIT5+BIT6;
}
void Receive_Byte(void)
{
int i;
P5DIR &=~BIT2;
R_word = 0x00;
for(i=0;i<8;i++)
{
// P5OUT |= BIT3;
P5OUT &=~ BIT3;
if(P5IN & 0x04)
R_word |= 0x01;
else
R_word &= 0xFE;
P5OUT |= BIT3;
R_word = R_word << 1;
}
R_word = R_word >> 1;
}
void Flash_B_ReadStat(void)
{
P4DIR |= BIT6;//CS out
P4OUT &=~BIT6;
cmd_word = 0xd7;
Send_Start();
while(1){
Receive_Byte();
if((R_word&RDY)==RDY)break;
}
Stop();
}
void page_to_buffer(int w_Page)
{
char by_High_Page,by_Low_Page;
w_Page = w_Page << 1;
by_High_Page = (char)(w_Page >> 8);
by_Low_Page = (char)w_Page;
//***********main memory page to buffer transfer*****************
P4DIR |= BIT6;
P4OUT &=~ BIT6;
cmd_word = 0x53;
Send_Start();
word = by_High_Page;;
Send_Byte();
word =by_Low_Page;
Send_Byte();
word = 0x0;
Send_Byte();
Stop();
Flash_B_ReadStat();
}
void page_program_through_buffer_jiance(int w_Page,int addr)//该函数用于将当前的检测的配置和结果送FLASH
{ int j;
char by_High_Page,by_Low_Page;
w_Page = w_Page << 1;
by_High_Page = (char)(w_Page >> 8);
by_Low_Page = (char)w_Page;
//***********main memory page program through buffer *****************
P4DIR |= BIT6;
P4OUT &=~ BIT6;
cmd_word = 0x82;
Send_Start();
word = by_High_Page;
Send_Byte();
word =by_Low_Page;
Send_Byte();
word = addr;
Send_Byte();
word =Cur_time.year;
Send_Byte();
word =Cur_time.month;
Send_Byte();
word =Cur_time.day;
Send_Byte();
word =Cur_time.hour;
Send_Byte();
word =Cur_time.minute;
Send_Byte();
word =Cur_time.second;
Send_Byte();
word =Cur_jiance.jiche;
Send_Byte();
word =Cur_jiance.leixing;
Send_Byte();
word =Cur_jiance.xinghaocode;
Send_Byte();
word =Cur_jiance.jieguo;
Send_Byte();
for(j=0;j<16;j++)
{
word = Cur_jiance.chehao[j];
// word =data;
Send_Byte();
}
for(j=0;j<16;j++)
{
word = Cur_jiance.xinghao[j];
// word =data;
Send_Byte();
}
Stop();
Flash_B_ReadStat();
}
void page_program_through_buffer_cgqi(int w_Page,int addr )//该函数用于将当前的传感器参数送FLASH
{ int j;
char by_High_Page,by_Low_Page;
char byte_High ,byte_Low;
w_Page = w_Page << 1;
by_High_Page = (char)(w_Page >> 8);
by_Low_Page = (char)w_Page;
//***********main memory page program through buffer *****************
P4DIR |= BIT6;
P4OUT &=~ BIT6;
cmd_word = 0x82;
Send_Start();
word = by_High_Page;
Send_Byte();
word =by_Low_Page;
Send_Byte();
word = addr;
Send_Byte();
word =Cur_chuanganqi.leixing;
Send_Byte();
word =Cur_chuanganqi.xinghaocode;
Send_Byte();
word =Cur_chuanganqi.danwei;
Send_Byte();
word =Cur_chuanganqi.dianyuan;
Send_Byte();
byte_High=(char)(Cur_chuanganqi.maxIN>>8);
word =byte_High;
Send_Byte();
byte_Low=(char)Cur_chuanganqi.maxIN;
word = byte_Low;
Send_Byte();
byte_High=(char)(Cur_chuanganqi.maxOUT>>8);
word =byte_High;
Send_Byte();
byte_Low=(char)Cur_chuanganqi.maxOUT;
word = byte_Low;
Send_Byte();
for(j=0;j<16;j++)
{
word = Cur_chuanganqi.xinghao[j];
// word =data;
Send_Byte();
}
Stop();
Flash_B_ReadStat();
}
void page_program_through_buffer_int(int w_Page,int addr,int data )//该函数用于将当前的整型变量送FLASH
{
char by_High_Page,by_Low_Page;
char byte_High ,byte_Low;
w_Page = w_Page << 1;
by_High_Page = (char)(w_Page >> 8);
by_Low_Page = (char)w_Page;
//***********main memory page program through buffer *****************
P4DIR |= BIT6;
P4OUT &=~ BIT6;
cmd_word = 0x82;
Send_Start();
word = by_High_Page;
Send_Byte();
word =by_Low_Page;
Send_Byte();
word = addr;
Send_Byte();
byte_High=(char)(data>>8);
word =byte_High;
Send_Byte();
byte_Low=(char)data;
word = byte_Low;
Send_Byte();
Stop();
Flash_B_ReadStat();
}
void page_program_through_buffer_dl(int w_Page,int addr,char *data )//该函数用于将当前的整型变量送FLASH
{
char by_High_Page,by_Low_Page;
char i;
w_Page = w_Page << 1;
by_High_Page = (char)(w_Page >> 8);
by_Low_Page = (char)w_Page;
//***********main memory page program through buffer *****************
P4DIR |= BIT6;
P4OUT &=~ BIT6;
cmd_word = 0x82;
Send_Start();
word = by_High_Page;
Send_Byte();
word =by_Low_Page;
Send_Byte();
word = addr;
Send_Byte();
for(i=0;i<100;i++)
{
word =data[i];
Send_Byte();
}
Stop();
Flash_B_ReadStat();
}
/*
void Flash_B_Write_buffer(int addr,char * data)
{ int j;
P4DIR |= BIT6;
P4OUT &=~ BIT6;
cmd_word = 0x84;
Send_Start();
word = 0;
Send_Byte();
word =0;
Send_Byte();
word = addr;
Send_Byte();
for(j=0;j<size;j++)
{
word = data[j];
// word =data;
Send_Byte();
}
Stop();
}
*/
void auto_page_rewrite(int w_Page)
{
char by_High_Page,by_Low_Page;
w_Page = w_Page << 1;
by_High_Page = (char)(w_Page >> 8);
by_Low_Page = (char)w_Page;
//***********auto page rewrite *****************
P4DIR |= BIT6;
P4OUT &=~ BIT6;
cmd_word = 0x58;
Send_Start();
word = by_High_Page;;
Send_Byte();
word =by_Low_Page;
Send_Byte();
word = 0x0;
Send_Byte();
Stop();
Flash_B_ReadStat();
}
void Flash_B_Write_dl(int w_Page,int addr,char *data)//该函数用于将当前的整型变量送FLASH
{
page_to_buffer( w_Page);
page_program_through_buffer_dl( w_Page,addr, data );
auto_page_rewrite(w_Page);
}
void Flash_B_Write_int(int w_Page,int addr,int data)//该函数用于将当前的整型变量送FLASH
{
page_to_buffer( w_Page);
page_program_through_buffer_int( w_Page,addr, data );
auto_page_rewrite(w_Page);
}
int Flash_B_Read_int(int w_Page,int addr)//该函数用于读一个FLASH值送整型变量
{
int jj;
char by_High_Page,by_Low_Page;
char byte_High ,byte_Low;
w_Page = w_Page << 1;
by_High_Page = (char)(w_Page >> 8);
by_Low_Page = (char)w_Page;
P4DIR |= BIT6;//CS out
P4OUT &=~BIT6;
cmd_word = 0xd2;
Send_Start();
word = by_High_Page;
Send_Byte();
word =by_Low_Page;
Send_Byte();
word = addr;
Send_Byte();
//发送4个等待字节
word = 0xff;
Send_Byte();
word = 0xff;
Send_Byte();
word = 0xff;
Send_Byte();
word = 0xff;
Send_Byte();
Receive_Byte();
byte_High= R_word;
Receive_Byte();
byte_Low= R_word;
jj=(byte_High<<8)+byte_Low;
Stop();
return jj;
}
char Flash_B_Read_chr(int w_Page,int addr)//该函数用于读一个FLASH值送整型变量
{
int jj;
char by_High_Page,by_Low_Page;
w_Page = w_Page << 1;
by_High_Page = (char)(w_Page >> 8);
by_Low_Page = (char)w_Page;
P4DIR |= BIT6;//CS out
P4OUT &=~BIT6;
cmd_word = 0xd2;
Send_Start();
word = by_High_Page;
Send_Byte();
word =by_Low_Page;
Send_Byte();
word = addr;
Send_Byte();
//发送4个等待字节
word = 0xff;
Send_Byte();
word = 0xff;
Send_Byte();
word = 0xff;
Send_Byte();
word = 0xff;
Send_Byte();
Receive_Byte();
jj= R_word;
Stop();
return jj;
}
void Flash_B_Write_jiance(int w_Page,int addr)//该函数用于将当前的检测的配置和结果送FLASH
{
page_to_buffer( w_Page);
page_program_through_buffer_jiance( w_Page,addr );
auto_page_rewrite(w_Page);
}
void Flash_B_Read_jiance(int w_Page,int addr)//该函数用于读FLASH中的检测的配置和结果
{
int j;
char by_High_Page,by_Low_Page;
// char byte_High ,byte_Low;
w_Page = w_Page << 1;
by_High_Page = (char)(w_Page >> 8);
by_Low_Page = (char)w_Page;
P4DIR |= BIT6;//CS out
P4OUT &=~BIT6;
cmd_word = 0xd2;
Send_Start();
word = by_High_Page;
Send_Byte();
word =by_Low_Page;
Send_Byte();
word = addr;
Send_Byte();
//发送4个等待字节
word = 0xff;
Send_Byte();
word = 0xff;
Send_Byte();
word = 0xff;
Send_Byte();
word = 0xff;
Send_Byte();
Receive_Byte();
Copy_time.year= R_word;
Receive_Byte();
Copy_time.month= R_word;
Receive_Byte();
Copy_time.day= R_word;
Receive_Byte();
Copy_time.hour= R_word;
Receive_Byte();
Copy_time.minute= R_word;
Receive_Byte();
Copy_time.second= R_word;
Receive_Byte();
cpCur_jiance.jiche= R_word;
Receive_Byte();
cpCur_jiance.leixing= R_word;
Receive_Byte();
cpCur_jiance.xinghaocode= R_word;
Receive_Byte();
cpCur_jiance.jieguo=R_word;
// byte_High= R_word;
// Receive_Byte();
// byte_Low= R_word;
// Cur_jiance.csjiguo=(byte_High<<8)+byte_Low;
// Receive_Byte();
// byte_High= R_word;
// Receive_Byte();
// byte_Low= R_word;
// Cur_jiance.bzjiguo=(byte_High<<8)+byte_Low;
for(j=0;j<16;j++)
{
Receive_Byte();
if((R_word<32)||(R_word>126))R_word=0;
cpCur_jiance.chehao[j]= R_word;
}
for(j=0;j<16;j++)
{
Receive_Byte();
if((R_word<32)||(R_word>126))R_word=0;
cpCur_jiance.xinghao[j]= R_word;
}
Stop();
}
void Flash_B_Write_cgqi(int w_Page,int addr)
{
page_to_buffer( w_Page);
page_program_through_buffer_cgqi( w_Page,addr );
auto_page_rewrite(w_Page);
}
void Flash_B_Read_cgqi(int w_Page,int addr)//该函数用于读FLASH中的传感器参数
{
int j;
char by_High_Page,by_Low_Page;
char byte_High ,byte_Low;
w_Page = w_Page << 1;
by_High_Page = (char)(w_Page >> 8);
by_Low_Page = (char)w_Page;
P4DIR |= BIT6;//CS out
P4OUT &=~BIT6;
cmd_word = 0xd2;
Send_Start();
word = by_High_Page;
Send_Byte();
word =by_Low_Page;
Send_Byte();
word = addr;
Send_Byte();
//发送4个等待字节
word = 0xff;
Send_Byte();
word = 0xff;
Send_Byte();
word = 0xff;
Send_Byte();
word = 0xff;
Send_Byte();
Receive_Byte();
Cur_chuanganqi.leixing= R_word;
Receive_Byte();
Cur_chuanganqi.xinghaocode= R_word;
Receive_Byte();
Cur_chuanganqi.danwei= R_word;
Receive_Byte();
Cur_chuanganqi.dianyuan= R_word;
Receive_Byte();
byte_High= R_word;
Receive_Byte();
byte_Low= R_word;
Cur_chuanganqi.maxIN=(byte_High<<8)+byte_Low;
Receive_Byte();
byte_High= R_word;
Receive_Byte();
byte_Low= R_word;
Cur_chuanganqi.maxOUT=(byte_High<<8)+byte_Low;
for(j=0;j<16;j++)
{
Receive_Byte();
if((R_word<32)||(R_word>126))R_word=0;
Cur_chuanganqi.xinghao[j]= R_word;
}
Stop();
}
/*
void Flash_B_Read_buffer(int addr)
{
int j;
P4DIR |= BIT6;//CS out
P4OUT &=~BIT6;
cmd_word = 0xd4;
Send_Start();
word = 0;
Send_Byte();
word =0;
Send_Byte();
word = addr;
Send_Byte();
word =0;
Send_Byte();
for(j=0;j<size;j++)
{
Receive_Byte();
R_tab[j]= R_word;
}
Stop();
}
*/
void Flash_B_power_on(void)
{
P4DIR |= BIT6;//CS out
P4OUT &=~BIT6;
cmd_word = 0xab;
Send_Start();
Stop();
}
void Flash_B_power_off(void)
{
P4DIR |= BIT6;//CS out
P4OUT &=~BIT6;
cmd_word = 0xb9;
Send_Start();
Stop();
}
void Flash_B_IOinit(void)
{
P4DIR |=BIT4+BIT5+BIT6;
P5SEL &=~(BIT1+BIT3+BIT2);
P5DIR |=BIT0+BIT3;
P5OUT |= BIT0+BIT3;
P4OUT |= BIT3+BIT4+BIT5+BIT6;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -