当前位置: 首页 > news >正文

AT45DB161串行FLASH操作

//cpu是MSP430F4618

//用的是SPI硬件接口

#define AT45DB_ARRAY_RD  0xe8
#define AT45DB_PAGE_RD     0xd2
#define AT45DB_BUF1_RD   0xd4
#define AT45DB_BUF2_RD   0xd6
#define AT45DB_STATUS_RD 0xd7

#define AT45DB_BUF1_WR   0x84
#define AT45DB_BUF2_WR   0x87
#define AT45DB_B12MER_WR 0x83
#define AT45DB_B22MER_WR 0x86
#define AT45DB_B12M_WR   0x88
#define AT45DB_B22M_WR   0x89
#define AT45DB_P_ER      0x81
#define AT45DB_B_ER      0x50
#define AT45DB_MPTB1     0x82
#define AT45DB_MPTB2     0x85

#define AT45DB_M2B1      0x53
#define AT45DB_M2B2      0x55
#define AT45DB_MCMPB1    0x60
#define AT45DB_MCMPB2    0x61
 

#define AT45DB_CS_LOW   P7OUT&=~BIT5
#define AT45DB_CS_HI    P7OUT|=BIT5
#define AT45DB_RST_LOW   P7OUT&=~BIT4
#define AT45DB_RST_HI    P7OUT|=BIT4

void spi_init(void)   //SPI口初始化

{
  ME2 |= USPIE1;
  U1CTL  |= SYNC+CHAR+MM;
  U1TCTL |= CKPH+SSEL1+SSEL0+STC;
  U1BR0 = 0x02;                             // SMCLK/2 for baud rate
  U1BR1 = 0;                                // SMCLK/2 for baud rate
  U1MCTL = 0;                               // Clear modulation
  U1CTL &= ~SWRST;                          // Initialize USART state machine
}
 

 
void delay ( void )
{
     _NOP();_NOP();_NOP();_NOP();_NOP();
     _NOP();_NOP();_NOP();_NOP();_NOP();
     _NOP();_NOP();_NOP();_NOP();_NOP();
     _NOP();_NOP();_NOP();_NOP();_NOP();

}

void at45db_cs_low (void)
{
  AT45DB_CS_LOW;
  _NOP();_NOP();_NOP();_NOP();_NOP();
}

void at45db_cs_hi (void)
{
  AT45DB_CS_HI ;
  _NOP();_NOP();_NOP();_NOP();_NOP();
}

INT8U at45db_wr_byte( INT8U content )
{
  U1TXBUF= content;
  delay(); delay();
  return U1RXBUF;

}


INT8U at45db_get_status ( void)  //读取状态
{

     at45db_cs_low();
     U1TXBUF= AT45DB_STATUS_RD;
     delay();
     U1TXBUF= 0x55;
     delay();
     at45db_cs_hi();
     return U1RXBUF;       
}

INT8U at45db_wr_page ( INT16U page_adr,INT8U *buf )  //写页 
{
  INT8U tmp1,tmp2;
  INT16U tmp_lenth;

  if (at45db_get_status ()!=0xac ) return 255;
  page_adr &=0xfff;
  page_adr <<=2;
  tmp1 =page_adr /256;
  tmp2 =page_adr %256;
  at45db_cs_low();
  U1TXBUF= AT45DB_BUF1_WR;  //command
  delay();
  U1TXBUF=0x00;             //don't care
  delay();
  U1TXBUF=0x00;             //don't care
  delay();
  U1TXBUF=0x00;             // in page adr
  delay();

  for ( tmp_lenth=0;tmp_lenth<512;tmp_lenth++)
  {
    U1TXBUF=*buf;
    buf++;
    delay();delay();delay();
  }
  delay();delay();
  at45db_cs_hi();
  delay(); delay(); delay(); delay(); delay();
  delay(); delay(); delay();delay(); delay();
  delay(); delay(); delay(); delay(); delay();
  delay(); delay(); delay(); delay(); delay();
  delay(); delay(); delay();delay(); delay();
  delay(); delay(); delay(); delay(); delay();
  delay(); delay(); delay(); delay(); delay();
  delay(); delay(); delay();delay(); delay();
  delay(); delay(); delay(); delay(); delay();
  delay(); delay(); delay(); delay(); delay();
  delay(); delay(); delay();delay(); delay();
  delay(); delay(); delay(); delay(); delay();
  delay(); delay(); delay(); delay(); delay();
  delay(); delay(); delay();delay(); delay();
  delay(); delay(); delay(); delay(); delay();
  at45db_cs_low();
  U1TXBUF= AT45DB_B12MER_WR;
  delay();
  U1TXBUF= tmp1;  //page adr
  delay();
  U1TXBUF= tmp2;  //page adr
  delay();
  U1TXBUF= 0x55;
  delay();
  delay();
  delay();
  at45db_cs_hi();
  delay();
  delay();
  delay();
  delay();
  return 0;

}

//读页,给定页和页内地址的读取
INT8U at45db_rd (INT16U page_adr,INT16U in_page_adr,INT8U *buf,INT16U lenth ) 
{
  INT8U tmp1,tmp2;
  INT16U tmp_lenth;

  if (at45db_get_status ()!=0xac ) return 255;
  page_adr &=0xfff;
  page_adr <<=2;
  tmp1 = in_page_adr /256;
  page_adr |=tmp1;

  tmp1 =page_adr /256;
  tmp2 =page_adr %256;
  at45db_cs_low();
  U1TXBUF= AT45DB_PAGE_RD;  //command
  delay();
  U1TXBUF=tmp1;             //page adr
  delay();
  U1TXBUF=tmp2;             //page adr
  delay();
  tmp1= in_page_adr %256;
  U1TXBUF=tmp1;             // in page adr
  delay();

  U1TXBUF=0x55;             // don't care bit
  delay();
  U1TXBUF=0x55;             // don't care bit
  delay();
  U1TXBUF=0x55;             // don't care bit
  delay();
  U1TXBUF=0x55;             // don't care bit
  delay();

  for ( tmp_lenth=0;tmp_lenth< lenth;tmp_lenth++)
  {
    U1TXBUF=0x55;
    delay();
    *buf = U1RXBUF;
    buf++;
  }
  at45db_cs_hi();
   return 0;
}

//页读取 (读取512字节)

INT8U at45db_rd_page (INT16U page_adr,INT8U *buf )
{
  INT8U tmp1,tmp2;
  INT16U tmp_lenth;

  if (at45db_get_status ()!=0xac ) return 255;
  page_adr &=0xfff;
  page_adr <<=2;
  tmp1 =page_adr /256;
  tmp2 =page_adr %256;
  at45db_cs_low();
  U1TXBUF= AT45DB_PAGE_RD;  //command
  delay();
  U1TXBUF=tmp1;             //page adr
  delay();
  U1TXBUF=tmp2;             //page adr
  delay();
  U1TXBUF=0x00;             // in page adr
  delay();

  U1TXBUF=0x55;             // don't care bit
  delay();
  U1TXBUF=0x55;             // don't care bit
  delay();
  U1TXBUF=0x55;             // don't care bit
  delay();
  U1TXBUF=0x55;             // don't care bit
  delay();

  for ( tmp_lenth=0;tmp_lenth<512;tmp_lenth++)
  {
    U1TXBUF=0x55;
    delay();
    *buf = U1RXBUF;
    buf++;
  }
  at45db_cs_hi();
   return 0;
}

//AT45DB测试

void at45db_test ( void)
{
  INT16U  page;
  page =0;

  for ( page =0;page <512;page ++)
  {
    at45db_buf[page]= page;
  }
  page =0;
  at45db_wr_page (  page, at45db_buf);  //写一页
  for ( page =0;page <30000;page ++) _NOP();

  page =0;

  while (1)
  {
    at45db_rd_page (page ,at45db_buf);  //按页读取
    page ++;
  }

}

void at45db_init ( void ) //初始化
{
  INT16U tmp;
  INT16U tmp_page;
  INT8U  tmp_b;
  AT45DB_RST_LOW;
  for ( tmp=0;tmp<sizeof(at45db_buf) ;tmp ++)
   {
     _NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
   }
  AT45DB_RST_HI;

  if ( hld_reg[AT45DB_INIT]== 0xa55a )
  {
    hld_reg[AT45DB_INIT]= 0;
    hld_reg[AT45DB_PAGE]=0;
    for ( tmp =0;tmp<4096;tmp ++ )
    {
       at45db_cs_low();
       tmp_page = tmp<<2;
       U1TXBUF= AT45DB_P_ER;
       delay();

       tmp_b=tmp_page /256;
       U1TXBUF= tmp_b;
       delay();
       tmp_b=tmp_page % 256;
       U1TXBUF= tmp_b;

       delay();
       U1TXBUF= 0x55;
       delay();
       at45db_cs_hi();

       do
        {
         for ( tmp_page=0; tmp_page< 40000; tmp_page++) _NOP();
         kill_wd();
        } while (at45db_get_status ( )!=0xac );

    }
  }

}

相关文章:

  • 晶振不集成到芯片内部的原因分析
  • Ubuntu中选择Python虚拟环境
  • 考拉悠然:科技与匠心,以烟草虫情AI监测系统共筑品质未来
  • git tag使用场景和实践
  • BDO分厂开展地沟“大清肠”工作
  • 交通运输行业综合智慧监管平台:商贸物流的安全与效率引擎
  • G3学习笔记
  • ejs列表渲染,条件渲染,在node中使用ejs
  • 【C++入门:类和对象】[3]
  • JS 应用算法逆向三重断点调试调用堆栈BP 插件发包安全结合
  • java中final以及static的作用
  • Linux并发与竞争:从生活例子到内核实战
  • 从对数变换到深度框架:逻辑回归与交叉熵的数学原理及PyTorch实战
  • 高企复审奖补!2025年合肥市高新技术企业重新认定奖励补贴政策及申报条件
  • 【AI论文】ToolRL:奖励是工具学习所需的一切
  • [创业之路-382]:企业法务 - 企业如何通过技术专利与技术秘密保护自己
  • 深度学习:迁移学习
  • rocky9.4部署k8s群集v1.28.2版本(containerd)(纯命令)
  • ssh启动不了报错
  • leetcode刷题日记——有效的括号
  • 俄外长拉夫罗夫将出席金砖国家外长会
  • 陈曦任中华人民共和国二级大法官
  • 佩索阿稳定常销,陀翁不断加印,青少年喜欢黑塞
  • 北京地铁5号线仗义执言女乘客发文:同理心无比重要,希望就此平息
  • 市场监管部门完成全国保健食品生产企业体系检查首轮全覆盖
  • 央行等:在上海试点通过再贴现窗口支持人民币跨境贸易融资