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

📄 data_flash.c

📁 MSP430方案,用于脉冲采集器,其功能众多,上传代码仅供参考,不得用于商业
💻 C
字号:
#include "data_flash.h"
#include "hal.h"
#include "pub_func.h"

unsigned short I2CTemp1;
unsigned char ErrIndication=0;
unsigned char I2CTemp0;

void _data_flash_clocks(unsigned char cnt)
{
    DATA_FLASH_SI_OUT&=~(DATA_FLASH_SI);
    do{
        DATA_FLASH_SCL_OUT&=~(DATA_FLASH_SCL);
        DATA_FLASH_SCL_OUT|=DATA_FLASH_SCL;
    }while(--cnt);
}

void _data_flash_write_byte(unsigned char wrbyte)
{
    unsigned char BitCounter=8;

    do{
        DATA_FLASH_SCL_OUT&=~(DATA_FLASH_SCL);
        if(wrbyte&0x80) DATA_FLASH_SI_OUT|=DATA_FLASH_SI;
        else DATA_FLASH_SI_OUT&=~(DATA_FLASH_SI);
        DATA_FLASH_SCL_OUT|=DATA_FLASH_SCL;
        wrbyte<<=1;
    }while(--BitCounter);
}

unsigned char _data_flash_read_byte(void)
{
    unsigned char rdbyte=0,BitCounter=8;

    do{
        DATA_FLASH_SCL_OUT&=~(DATA_FLASH_SCL);
        rdbyte<<=1;
        DATA_FLASH_SCL_OUT|=DATA_FLASH_SCL;
        if(DATA_FLASH_SO_IN&DATA_FLASH_SO) rdbyte++;
    }while(--BitCounter);
    
    return(rdbyte);
}

unsigned char _data_flash_read_status(void)
{
    unsigned char sta;
    // enable
    DATA_FLASH_CS_OUT&=~(DATA_FLASH_CS);
    // cmd
    _data_flash_write_byte(DF_READ_STATUS1);
    sta=_data_flash_read_byte();
    // disable
    DATA_FLASH_CS_OUT|=DATA_FLASH_CS;
    DATA_FLASH_SI_OUT|=DATA_FLASH_SI;
    DATA_FLASH_SCL_OUT|=DATA_FLASH_SCL;
    _clr_wdt();
    return sta;
}

void _data_flash_read_buffer1(unsigned char *data,unsigned char len)
{
    unsigned char i;
    // enable
    DATA_FLASH_CS_OUT&=~(DATA_FLASH_CS);
    
    _data_flash_write_byte(DF_READ_BUFFER1);
    _data_flash_clocks(8);
    _data_flash_write_byte((unsigned char)(I2CTemp1&0x01));
    _data_flash_write_byte((unsigned char)I2CTemp0);
    for(i=0;i<len;i++)
    {
        *(data+i)=_data_flash_read_byte();
    }
    // disable
    DATA_FLASH_CS_OUT|=DATA_FLASH_CS;
    DATA_FLASH_SI_OUT|=DATA_FLASH_SI;
    DATA_FLASH_SCL_OUT|=DATA_FLASH_SCL;
}

void _data_flash_write_buffer1(unsigned char *data,unsigned char len)
{
    unsigned char i;
    // enable
    DATA_FLASH_CS_OUT&=~(DATA_FLASH_CS);
    
    _data_flash_write_byte(DF_WRITE_BUFFER1);
    _data_flash_clocks(16);
    _data_flash_write_byte((unsigned char)I2CTemp0);
    for(i=0;i<len;i++)
    {
        _data_flash_write_byte(*(data+i));
    }
    // disable
    DATA_FLASH_CS_OUT|=DATA_FLASH_CS;
    DATA_FLASH_SI_OUT|=DATA_FLASH_SI;
    DATA_FLASH_SCL_OUT|=DATA_FLASH_SCL;
}

void _data_flash_read(unsigned long addr,unsigned char *data,unsigned char len)
{
    unsigned char i;
    unsigned long temp;
    
    ErrIndication=0;
    I2CTemp1=0;
    I2CTemp0=0;
    temp=addr;

    for(;temp>=0x100;temp-=0x100)
    {
        I2CTemp1++;
    }

    I2CTemp1<<=1;
    I2CTemp0=temp;
    _disable_interrupt();
    // enable
    DATA_FLASH_CS_OUT&=~(DATA_FLASH_CS);

    // cmd
    _data_flash_write_byte(DF_ARRAY_READ);
    // slave address
    _data_flash_write_byte((unsigned char)(I2CTemp1>>8));
    _data_flash_write_byte((unsigned char)I2CTemp1);
    _data_flash_write_byte((unsigned char)I2CTemp0);
    _data_flash_write_byte(0);
    _data_flash_write_byte(0);
    _data_flash_write_byte(0);
    _data_flash_write_byte(0);
    
    for(i=0;i<len;i++)
    {
        *(data+i)=_data_flash_read_byte();
        if(++temp>=0x100)
        {
            _data_flash_clocks(64);
            temp=0;
        }
    }
    
    // disable
    DATA_FLASH_CS_OUT|=DATA_FLASH_CS;
    _enable_interrupt();
    DATA_FLASH_SI_OUT|=DATA_FLASH_SI;
    DATA_FLASH_SCL_OUT|=DATA_FLASH_SCL;
    _clr_wdt();
}

void _data_flash_write(unsigned long addr,unsigned char *data,unsigned char len)
{
    unsigned long temp;
    unsigned char len1,flg=0,waittime;
    
#ifdef TEST_COURSES
    //LcdLightOn(1);
#endif

    ErrIndication=0;
    I2CTemp1=0;
    I2CTemp0=0;
    temp=addr;

    for(;temp>=0x100;temp-=0x100)
    {
        I2CTemp1++;
    }
    
    if(temp+len>=0x100)
    {
        len1=0x100-temp;
        flg=1;
    }
    else
    {
        len1=len;
    }

DF_WRITE_STA:
    I2CTemp1<<=1;
    I2CTemp0=temp;
    
    _disable_interrupt();
    // Transfer main memory page to buffer1
    // enable
    DATA_FLASH_CS_OUT&=~(DATA_FLASH_CS);
    _data_flash_write_byte(DF_MAIN_TO_BUFFER1);
    _data_flash_write_byte((unsigned char)(I2CTemp1>>8));
    _data_flash_write_byte((unsigned char)I2CTemp1);
    _data_flash_clocks(8);
    // disable
    DATA_FLASH_CS_OUT|=DATA_FLASH_CS;
    DATA_FLASH_SI_OUT|=DATA_FLASH_SI;
    DATA_FLASH_SCL_OUT|=DATA_FLASH_SCL;
    waittime=0;
    while(_data_flash_read_status()!=0xA4)
    {
        if(waittime++>100)
        break;
    }
    
    _data_flash_write_buffer1(data,len1);

    waittime=0;
    while(_data_flash_read_status()!=0xA4)
    {
        if(waittime++>100)
        break;
    }
    
    // enable
    DATA_FLASH_WP_OUT|=DATA_FLASH_WP;
    _NOP();
    _NOP();
    DATA_FLASH_CS_OUT&=~(DATA_FLASH_CS);
    _data_flash_write_byte(DF_WMM_WBIE_BUF1);
    // slave address
    _data_flash_write_byte((unsigned char)(I2CTemp1>>8));
    _data_flash_write_byte((unsigned char)I2CTemp1);
    _data_flash_write_byte(I2CTemp0);
    DATA_FLASH_CS_OUT|=DATA_FLASH_CS;
    // disable

    waittime=0;
    while(_data_flash_read_status()!=0xA4)
    {
        if(waittime++>100)
        break;
    }
    
    DATA_FLASH_CS_OUT|=DATA_FLASH_CS;
    DATA_FLASH_WP_OUT&=~(DATA_FLASH_WP);
    _enable_interrupt();
    DATA_FLASH_SI_OUT|=DATA_FLASH_SI;
    DATA_FLASH_SCL_OUT|=DATA_FLASH_SCL;

    if(flg)
    {
        data+=len1;
        len1=len-len1;
        temp=0;
        I2CTemp1>>=1;
        I2CTemp1++;
        flg=0;
        goto DF_WRITE_STA;
    }
}

unsigned char _load_data(unsigned long addr,unsigned char *data,unsigned char len)
{
    unsigned char ii,temp=0,rdata[30];
    
    if(len>29)
    {
        return ERROR;
    }
    //_data_flash_read(addr,data,len);
    //_data_flash_read(addr+len,&sum,1);
    _data_flash_read(addr,rdata,len+1);

    for(ii=0;ii<len;ii++)
    {
        temp+=rdata[ii];
        data[ii]=rdata[ii];
    }

    if(rdata[len]==temp)
    {
        return OK;
    }
    else
    {
        return ERROR;
    }
}

unsigned char _save_data(unsigned long addr,unsigned char *data,unsigned char len)
{
    unsigned char jj=0,ii,temp=0,rdata[30],wdata[30];

    if(len>29)
    {
        return ERROR;
    }
    for(ii=0;ii<len;ii++)
    {
        temp+=data[ii];
        wdata[ii]=data[ii];
    }
    wdata[len]=temp;

StartToSave:

    _data_flash_write(addr,wdata,len+1);
    //_data_flash_write(addr+len,(unsigned char *)&temp,1);
    
    _data_flash_read(addr,rdata,len+1);

    for(ii=0;ii<len+1;ii++)
    {
        if(wdata[ii]!=rdata[ii])
        {
            goto ReStartToSave;
        }
    }
    return OK;
    
ReStartToSave:

    if(jj++<3)
    {
        goto StartToSave;
    }
    else
    {
        return ERROR;
    }
}

⌨️ 快捷键说明

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