在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!)    创芯人才网--重磅上线啦!
查看: 2937|回复: 10

[资料] 免费样片试用心得,附源码!(ZT)

[复制链接]
发表于 2014-6-27 15:27:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x

最近申请了富士通半导体的SPI 铁电片子MB85RS64,很快邮寄到了,给厂商赞一个! 看资料,铁电存储器吸收了FlashRAM二者的优点于一身,耐擦写次数可达到1012次方,写数据耗时也比FlashEEPROM要少,片子在3.3V下操作,运行和待机功耗也做得很棒。 这次的方案是用M058SIO模拟SPI,完成读写,看了资料,主要就是注意6 OP-CODE在操作时完成的功能。


在读状态寄存器之前,先赋值0xabarraydata[]是读取bufferwritedata[]是写入 buffer,之前,测试时是这样,写入,由于使能了写使能1次,然后连续写,发现只在 0x00地址处写入了0xaa,细读手册,发现,每次写之后,片子都会复位写使能,所以每次写之前都要使能写使能,有点拗口,之后的测试向地址0x00~0x04,写入0xaa~0xee ,再读出,与写入的一样,读写成功。


片子操作不复杂,使用起来容易上手,性能不错,值得推荐!! 源码如下:


uint8_t SpiRead(void)

//主机在SCK下降沿,从MISO上读取1字节

{

        uint8_t i;

        for(i=0;i<8;i++)

        {

                DATA_BUF = DATA_BUF<<1;


                MB85RS64_SCK = 1;


                if(MB85RS64_MISO)

                {

                        DATA_BUF+=1;

                }

                else

                {

                        DATA_BUF+=0;

                }


                MB85RS64_SCK = 0;

        }

        return DATA_BUF;

}


void SpiWrite(uint8_t byte)

//主机向MOSI1字节,设备在SCK上升沿读取

{

        uint8_t i;

        DATA_BUF = byte;

        MB85RS64_SCK = 0;

        for(i=0;i<8;i++)

        {

                if(DATA_BUF >> 7)

                {

                        MB85RS64_MOSI = 1;

                }

                else

                {

                        MB85RS64_MOSI = 0;

                }

                #if 1

                MB85RS64_SCK = 1;

                DATA_BUF = DATA_BUF << 1;

                MB85RS64_SCK = 0;

                #else

                MB85RS64_SCK = 0;

                MB85RS64_SCK = 1;

                DATA_BUF = DATA_BUF << 1;

                #endif


        }


}


void SetWriteEnableLatch(void)

//OP CODE: 0000 0110

{        

        MB85RS64_CS = 0;        

        SpiWrite(0x06);        

        MB85RS64_CS = 1;

}


voidResetWriteEnableLatch(void)

//OP CODE: 0000 0100

{

        MB85RS64_CS = 0;

        SpiWrite(0x04);

        MB85RS64_CS = 1;

}


uint8_tReadStatusRegister(void)

//OP CODE: 0000 0101

{

        uint8_t rsr_byte;


        MB85RS64_CS = 0;


        SpiWrite(0x05);


        rsr_byte = SpiRead();


        MB85RS64_CS = 1;


        return rsr_byte;


}


voidWriteStatusRegister(uint8_t wsr_byte)

//OP CODE: 0000 0001

{

        uint8_t rsr_byte;


        MB85RS64_CS = 0;


        SpiWrite(0x01);


        SpiWrite(wsr_byte);


        MB85RS64_CS = 1;

}


uint8_t ReadMemoryCode(uint16_taddr)

//OP CODE: 0000 0011

{

        uint8_t rmc_byte;

        uint8_t addr_high, addr_low;


        addr_high =(uint8_t)(addr&0xff00)>>8;

        addr_low  = (uint8_t)(addr&0x00ff);


        MB85RS64_CS = 0;


        SpiWrite(0x03);


        SpiWrite(addr_high);

        SpiWrite(addr_low);


        rmc_byte = SpiRead();


        MB85RS64_CS = 1;


        return rmc_byte;


}


void WriteMemoryCode(uint16_taddr, uint8_t wmc_byte)

//OP CODE: 0000 0010

{

        uint8_t addr_high, addr_low;


        addr_high =(uint8_t)(addr&0xff00)>>8;

        addr_low  = (uint8_t)(addr&0x00ff);


        MB85RS64_CS = 0;


        SpiWrite(0x02);


        SpiWrite(addr_high);

        SpiWrite(addr_low);


        SpiWrite(wmc_byte);


        MB85RS64_CS = 1;


}


void FRAM_Operate(void)

{

        uint8_t status = 0xab;

        uint8_t arraydata[5];

        uint8_t writedata[5];

        uint16_t i;


        memcpy(writedata,"\xaa\xbb\xcc\xdd\xee", 5);


        memcpy(arraydata,"\x01\x02\x03\x04\x05", 5);


        TRACE("-------  before Read ---------\r\n");

        TRACE("status = 0x%02x",status);

        printbuf("arraydata",arraydata, sizeof(arraydata));


        SetWriteEnableLatch();


        status = ReadStatusRegister();


        for(i=0;i<sizeof(arraydata);i++)

        {

                arraydata = ReadMemoryCode(i);

        }


        TRACE("-------  after Read ---------\r\n");

        TRACE("status = 0x%02x",status);

        printbuf("arraydata",arraydata, sizeof(arraydata));


        for(i=0;i<sizeof(writedata);i++)

        {

                SetWriteEnableLatch();

                WriteMemoryCode(i,writedata);


        }


        TRACE("\r\n-------  after Write writedata ---------");

        printbuf("writedata",writedata, sizeof(writedata));

        TRACE("-------  after Read again ---------");


        memset(arraydata, 0x00,sizeof(arraydata));

        for(i=0;i<sizeof(arraydata);i++)

        {

                arraydata =ReadMemoryCode(i);

        }


        printbuf("arraydata",arraydata, sizeof(arraydata));


}


既然是模拟SPI,涉及到的CS, MOSI,MISO, SCK可以自由设定了,注意MISO,设置成输入模式。(本文作者:springvirus


QQ图片20140627150559.jpg


QQ图片20140627150608.jpg


QQ图片20140627150619.jpg


发表于 2014-6-30 17:46:08 | 显示全部楼层
感谢楼主分享,能给个申请样片的链接吗?
发表于 2014-7-3 09:54:37 | 显示全部楼层
富士通的FRAM?楼主是用在哪里?我们的工业电表全部是用的富士通FRAM,几乎市场上都是他们家在供应啊,工艺太独特了!
发表于 2014-7-7 14:57:44 | 显示全部楼层
喜大普奔!!!有关注富士通半导体的微博吗?
发表于 2014-7-8 15:04:41 | 显示全部楼层
给富士通半导体点个赞(貌似申请没有量的限制,据说去年最多有人申请了100片,不知真假?!)
发表于 2014-7-9 14:21:27 | 显示全部楼层
100片样片?有这么大方吗?至少几大百大洋啊
发表于 2014-7-10 17:16:01 | 显示全部楼层
呵呵,这玩意儿不能吃,没有这样设计需求的谁去免费申请啊?
发表于 2014-7-11 15:02:52 | 显示全部楼层
爽,免费送样片还有奖抽啊, 一等奖是价值2300元的佳能(Canon)数码相机一部,期待RP爆发啊!
发表于 2014-7-14 11:30:37 | 显示全部楼层
这玩意儿在医疗电子中应用也很多,排除一些低端市场,在要求高可靠性、高速/高耐久性数据读写、低功耗、抗辐射等高端医疗设备中,FRAM用的非常广泛。貌似8月份的医疗电子技术大会上富士通也会参展,到时候看看去。
发表于 2014-7-15 09:41:52 | 显示全部楼层
推荐一个视频, “智能时代的存储解决方案—富士通FRAM”,是前不久富士通半导体在杭州智能三表 (电表、热表、水表)IC创新技术与设计研讨会上的演讲视频:http://www.big-bit.com/video/show-130.html 想了解FRAM的筒子可以看下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-11 22:40 , Processed in 0.037354 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表