首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

【晒FRAM铁电存储器样片】+使用io模拟SPI操作,读写和测试保护程序成功

【晒FRAM铁电存储器样片】+使用io模拟SPI操作,读写和测试保护程序成功

本帖最后由 youzizhile 于 2014-8-20 21:26 编辑

SPI FLASH MB85RS64使用过程总结


通过器件手册查看富士通MB85RS64铁电存储器参数,主要有以下特性:


使用工业标准串行外设接口SPI进行双向传输,它最大可以达到20MHZ的操作速度;
像RAM一样快速读写,低功耗:
工作电源电流5毫安/20Mhz、微待机电流;
数据在掉电后可以保存10年;

能以总线速度进行写操作,无须延时、无须等待时间,而E2PROM需要等待时间

当数据被移入芯片后,下一个总线周期可以立刻开始而无须进行数轮循;

具有比其它非易失性存储器高得多的读写操作次数,可以承受超过一万亿次的读写操作;


富士通MB85RS64铁电存储器使用高速SPI接口增强了铁电技术的高速写数据能力


存储能力:8192words*8


兼容 SPI mode 0 (0, 0) 和mode 3 (1, 1);


供电时0 V to 3.6 V;


工作温度是 40 °C to
+ 85 °C


封装:SOP-8


器件的封装和引脚图如下:




其内部寄存器状态如下图所示:


操作码总共有6个:




本次操作用到的有WREN(0x06),WRITE(0x020),READ(0x03),RDSR(0x05),WRSR(0x01).


测试电路图如下,io口连接在SPI0上面:





测试电路


so-8转接dip-8板子



收到的芯片


首先使用的是IO模拟SPI操作,相关程序说明如下:
1 SPI io对应设置

#include "DrvGPIO.h"
#define MB_SO    DrvGPIO_GetBit(E_PORT1,6)//读取so状态
#define CS_SET DrvGPIO_SetBit(E_PORT1, 4)//cs=1
#define CS_CLR DrvGPIO_ClrBit(E_PORT1, 4) //cs=0

#define SI_SET DrvGPIO_SetBit(E_PORT1, 5) //si=1
#define SI_CLR DrvGPIO_ClrBit(E_PORT1, 5) //si=0

#define SCK_SET DrvGPIO_SetBit(E_PORT1, 7) //sck=1
#define SCK_CLR DrvGPIO_ClrBit(E_PORT1, 7) //sck=0

void io_initial(void)
{
        //输入的信号
        DrvGPIO_Open(E_PORT1,4, E_IO_OUTPUT);        //cs
        DrvGPIO_Open(E_PORT1,6, E_IO_INPUT);        //so
        DrvGPIO_Open(E_PORT1,5, E_IO_OUTPUT);        //si
        DrvGPIO_Open(E_PORT1,7, E_IO_OUTPUT);        //sck
}
void usleep(unsigned  int value)
{

  unsigned int i;
  while(value--)
  {
   for(i=1;i<2;i++)
   ;
  }
}

/********************************
  SPI写一个字节数据
********************************/
void  spi_write_byte(unsigned   char spi_bValue)
{
        unsigned   char   i;
        SCK_CLR;
           usleep(DELAY_TIME);
                for(i=0;i<8;i++)
                        {
                         SCK_CLR;
                    usleep(DELAY_TIME);

                                   if((spi_bValue &0x80)== 0x80)
                                      SI_SET;
                                   else
                               SI_CLR;
                                   spi_bValue   =   (spi_bValue   <<1);
                    usleep(DELAY_TIME);
                    SCK_SET;
                    usleep(DELAY_TIME);
                        }
}
/********************************
          SPI读出一个字节数据
********************************/
unsigned char spi_read(void)
{
         unsigned char i,spi_dat;
         for (i=0;i<8;i++)
                 {
                         SCK_CLR;
                         spi_dat=(spi_dat<<1);

                   if(MB_SO==1)
                           spi_dat|=0x01;
                  else
                          spi_dat&=~0x01;
                   SCK_SET;
                 }
         CS_SET;
         return spi_dat;
}
/********************************
          向MB85RS64写入一个字节数据
********************************/

void write_mb85s64(unsigned short address,unsigned char data)
{
        CS_CLR;
        spi_write_byte(0x06);
        CS_SET;
        usleep(DELAY_TIME);
        CS_CLR;
        spi_write_byte(0x02);
        spi_write_byte((address & 0xff00)>>8);
        spi_write_byte(address & 0x00ff);
        spi_write_byte(data);
        CS_SET;
}
/********************************
          从MB85RS64读入一个字节数据
********************************/

unsigned char read_mb85s64(unsigned short address)
{
        CS_CLR;
        spi_write_byte(0x03);
        spi_write_byte((address&0xff00)>>8);
        spi_write_byte(address&0x00ff);
         return spi_read();
}
本帖最后由 youzizhile 于 2014-7-17 00:05 编辑

测试主程序如下:
int main(void)
{
        unsigned char i,data;
           /* Enable the 12MHz oscillator oscillation */
            DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);
            DrvSYS_SelectHCLKSource(0);

            /* 系统频率设定 48Mhz */
            DrvSYS_Open(48000000);
        UART_Configuration();
        io_initial();
        uart_printf("test\r\n");
        if(1)
                    {
                uart_printf("second test start \r\n");
                                for(i=0;i<16;i++)
                                {
                                        write_mb85s64(i,i+0x99);
                                        delay1(10000);
                                        data=read_mb85s64(i);
                                        uart_printf("test data is ");
                                        uart_print_hex(data,2);
                                        uart_printf("\r\n");
                                        delay1(1000);
                                }
}
        uart_printf("test protect!\r\n");
        test_protect();
while(1)
{
}
}
//测试保护段设置,通过打开和关闭寄存器中的BP0和BP1位值,来验证和测试实际的保护功能。下面的程序是全部保护,所以使能读取数据,不能再进行写入,除非关闭保护设置。
void test_protect(void)
{
         unsigned char test_data[5];
         unsigned char writedata[5]={0x11,0x22,0x33,0x44,0x55};
         unsigned char i,data;

        CS_CLR;
        spi_write_byte(0x06);
        CS_SET;
        usleep(10);
        uart_printf("-------  Read address  0 to 5 of before write ,the data is---------\r\n");
        for(i=0;i<5;i++)
                {
                                test_data= read_mb85s64(i);
                                uart_print_hex(  
test_data,2);
                }
                uart_printf("\r\n");
                uart_printf("\r\n");
        uart_printf("\r\n------- turn on the protect bolck ---------\r\n");
        CS_CLR;
        spi_write_byte(0x01);
        uart_printf("write register data is 8c!\r\n ");
        spi_write_byte(0x8c);
        CS_SET;
        CS_CLR;
        spi_write_byte(0x05);
        data=spi_read();
        uart_printf("register data is   ");
        uart_print_hex(data,2);
        uart_printf("\r\n");
        CS_SET;

        uart_printf("-------  before Read address  0 to 5,data is---------\r\n");
                for(i=0;i<5;i++)
                        {
                                       
test_data= read_mb85s64(i);
                                        uart_print_hex(  
test_data,2);
                        uart_printf("\r\n");
                        }
                        uart_printf("\r\n");

                uart_printf("-------  write data is ---------\r\n");
                for(i=0;i<5;i++)
                {
                                CS_CLR;
                                spi_write_byte(0x06);
                                CS_SET;
                                write_mb85s64(i, writedata);
                                uart_print_hex( writedata,2);
                }
                uart_printf("\r\n");
                uart_printf("\r\n-------  after Write writedata ,the store data is ---------\r\n");
                for(i=0;i<5;i++)
                         {
                                         
test_data= read_mb85s64(i);
                                         uart_print_hex(
test_data,2);
                                         uart_printf("\r\n");
                         }
                uart_printf("\r\n");

                uart_printf("\r\n------- turn off the protect bolck ---------\r\n");
                CS_CLR;
                spi_write_byte(0x06);
                CS_SET;
                usleep(10);
                CS_CLR;
                spi_write_byte(0x01);
                uart_printf("write register data is 80!\r\n ");
                spi_write_byte(0x80);
                CS_SET;
                CS_CLR;
                spi_write_byte(0x05);
                data=spi_read();
                uart_printf("read register data is ");
                uart_print_hex(data,2);
                uart_printf(" \r\n");
                CS_SET;
                for(i=0;i<5;i++)
                                {
                                                CS_CLR;
                                                spi_write_byte(0x06);
                                                CS_SET;
                                                write_mb85s64(i, writedata);
                                                uart_print_hex( writedata,2);
                                }
                uart_printf("\r\n");
                                uart_printf("\r\n-------  after Write writedata ,the store data is ---------\r\n");
                                for(i=0;i<5;i++)
                                         {
                                                         
test_data= read_mb85s64(i);
                                                         uart_print_hex(
test_data,2);
                                                         uart_printf(" \r\n");
                                         }
                                uart_printf("\r\n");
}
本帖最后由 youzizhile 于 2014-8-20 21:28 编辑

写入保护区的位置是0000到1ffff位置,所以是只能读,不能写的。


test_protect的测试结果如下:

本帖最后由 youzizhile 于 2014-7-14 16:45 编辑

main函数的程序执行结果如下所示
test
second test start
test data is 99
test data is 9A
test data is 9B
test data is 9C
test data is 9D
test data is 9E
test data is 9F
test data is A0
test data is A1
test data is A2
test data is A3
test data is A4
test data is A5
test data is A6
test data is A7
test data is A8
test protect!
-------  Read address  0 to 5 of before write ,the data is---------
999A9B9C9D


------- turn on the protect bolck ---------
write register data is 8c!
register data is   8C
-------  before Read address  0 to 5,data is---------
99
9A
9B
9C
9D

-------  write data is ---------
1122334455

-------  after Write writedata ,the store data is ---------
99
9A
9B
9C
9D


------- turn off the protect bolck ---------
write register data is 80!
read register data is 80
1122334455

-------  after Write writedata ,the store data is ---------
11
22
33
44
55

接下来要抽时间测试下SPI的性能,看下在实际应用中,最大处理速度可以到多少!
本帖最后由 youzizhile 于 2014-7-14 17:39 编辑

刚才使用示波器测试,由于新唐的MCU的io性能影响,最大SCK速率只能到130Khz,假若要是用新唐MCU的SPI接口的话,主模式可以到20Mhz,所以使用IO模拟的SPI性能和真正的SPI还差很远!
6# youzizhile 这一测试速率的方法就是去其中的延时去掉,然后使用示波器看看SCK的速度,但是受限于当前的cpu,所以不能满速率测试!
这样片晒得,太详尽了,必须赞呀
8# hanshuang 谢谢支持,也快点来参与吧
1# youzizhile

怎么我看不到图片啊?
10# yang_alex 是不是网络的原因呢?之前都是可以显示的
返回列表