标题:
【晒FRAM铁电存储器样片】+四川省TI杯省赛集训FRAM应用
[打印本页]
作者:
xxxlzjxxx
时间:
2014-8-20 22:51
标题:
【晒FRAM铁电存储器样片】+四川省TI杯省赛集训FRAM应用
哈哈哈,首先非常感谢富士通半导体的样片,让我有幸体验到FRAM的好处。本人只是一个电子小菜鸟,今年有幸参加四川省TI省赛,在学校集训器件得到了mb85rc64样片,于是顺便就是用到当时的集训题目上了。“双相信号发生器”。话不多说,直接上原理图。
下载
(53.15 KB)
2014-8-20 22:51
下载
(36.37 KB)
2014-8-20 22:51
MCU使用的MSP430F1611,毕竟这是TI的比赛,哈哈哈。这片FRAM的接线方式与普通的存储器一样,便于替换,但是性能大大提高。
至于mb85rc64的读写和其余的EEPROM一样,就不再多说了。附上程序源码。
下面是.c文件。
#include <msp430x16x.h>
#include "i2c.h"
#define SCL_OUT_H P6OUT |= BIT6 //SCL = 1
#define SCL_OUT_L P6OUT &=~ BIT6 //SCL = 0
#define SCL_DIR_OUT P6DIR |= BIT6
#define SDA_OUT_H P6OUT |= BIT7 //SDA = 1
#define SDA_OUT_L P6OUT &=~ BIT7 //SDA = 0
#define SDA_DIR_IN P6DIR &=~ BIT7; //I/O口为输入
#define SDA_DIR_OUT P6DIR |= BIT7 //I/0口为输出
#define SDA_IN ((P6IN >> 7) & 0x01) //Read SDA
unsigned char ack;
/*******************************************************************
起动总线函数
函数原型: void Start_I2c();
功能: 启动I2C总线,即发送I2C起始条件.
********************************************************************/
void Start_I2c(void)
{
SCL_DIR_OUT; //SCK I/O口设为输出
SDA_DIR_OUT; //SDA I/O口设为输出
SDA_OUT_H; //发送起始条件的数据信号
DelayNus(2);
SCL_OUT_H ;
DelayNus(6); //起始条件建立时间大于4.7us,延时
SDA_OUT_L; //发送起始信号
DelayNus(6); //起始条件建立时间大于4.7us,延时
SCL_OUT_L; //钳住I2C总线,准备发送或接收数据
}
/*******************************************************************
结束总线函数
函数原型: void Stop_I2c();
功能: 结束I2C总线,即发送I2C结束条件.
********************************************************************/
void Stop_I2c(void)
{
SCL_DIR_OUT;//SCK I/O口设为输出
SDA_DIR_OUT;//SDA I/O口设为输出
SDA_OUT_L;
DelayNus(2);
SCL_OUT_H;
DelayNus(6);//起始条件建立时间大于4.7us,延时
SDA_OUT_H;
DelayNus(6);
}
void SendByte(unsigned char c)
{
unsigned char i;
SCL_DIR_OUT;//I/O口设为输出
SDA_DIR_OUT;//I/O口设为输出
for(i=0;i<8;i++)
{
if((c<<i) & 0x80) SDA_OUT_H; //判断发送位
else SDA_OUT_L;
DelayNus(2);
SCL_OUT_H;
DelayNus(6);
SCL_OUT_L;
DelayNus(6);
}
//slave应答
SDA_OUT_H;//SDA必须释放
DelayNus(2);
SCL_OUT_H;
DelayNus(6);
SDA_DIR_IN;//I/O口设为输入
if (SDA_IN == 0X01) ack=0;
else ack=1;//应答
SCL_OUT_L;
SCL_DIR_OUT;//I/O口设为输出
SDA_DIR_OUT;//I/O口设为输出
}
unsigned char RcvByte(void)
{
unsigned char i;
unsigned char c=0;
SDA_OUT_H;//
SCL_DIR_OUT;//I/O口设为输出
SDA_DIR_IN;//I/O口设为输入
for(i=0;i<8;i++)
{
SCL_OUT_L; //置时钟线为低,准备接收数据位
DelayNus(6);//时钟低电平周期大于4.7μs
SCL_OUT_H;
DelayNus(2);
c<<=1;
if(SDA_IN)
{
c+=1; //读数据位,将接收的数据存c
}
}
SCL_OUT_L;
SCL_DIR_OUT;//I/O口设为输出
SDA_DIR_IN;//I/O口设为输出
return c;
}
void Ack_I2c(unsigned char a)
{
SCL_DIR_OUT;//I/O口设为输出
SDA_DIR_OUT;//I/O口设为输出
if(a==0) SDA_OUT_L; /*在此发出应答或非应答信号 */
else SDA_OUT_H;
DelayNus(6);
SCL_OUT_H;
DelayNus(6); /*时钟低电平周期大于4μs*/
SCL_OUT_L; /*清时钟线,钳住I2C总线以便继续接收*/
}
unsigned char ISendByte(unsigned char sla,unsigned char c)
{
Start_I2c(); /*启动总线*/
SendByte(sla); /*发送器件地址*/
if(ack==0)return(0);
SendByte(c); /*发送数据*/
if(ack==0)return(0);
Stop_I2c(); /*结束总线*/
return(1);
}
unsigned char ISendStr(unsigned char sla,unsigned char suba,
unsigned char *s,unsigned char no)
{
unsigned char i;
Start_I2c(); /*启动总线*/
SendByte(sla); /*发送器件地址*/
if(ack==0)return(0);
SendByte(suba); /*发送器件子地址*/
if(ack==0)return(0);
for(i=0;i<no;i++)
{
SendByte(*s); /*发送数据*/
if(ack==0)return(0);
s++;
}
Stop_I2c(); /*结束总线*/
return(1);
}
unsigned char IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,
unsigned char no)
{
unsigned char i;
Start_I2c(); /*启动总线*/
SendByte(sla); /*发送器件地址*/
if(ack==0)return(0);
SendByte(suba); /*发送器件子地址*/
if(ack==0)return(0);
Start_I2c();
SendByte(sla+1);
if(ack==0)return(0);
for(i=0;i<no-1;i++)
{
*s=RcvByte(); /*发送数据*/
Ack_I2c(0); /*发送就答位*/
s++;
}
*s=RcvByte();
Ack_I2c(1); /*发送非应位*/
Stop_I2c(); /*结束总线*/
return(1);
}
复制代码
下面是头文件。
#ifndef _I2C_H
#define _I2C_H
#define SDA_1 P4OUT|=BIT1 //SDA = 1
#define SDA_0 P4OUT&=~BIT1 //SDA = 0
#define SCL_1 P4OUT|=BIT0 //SCL = 1
#define SCL_0 P4OUT&=~BIT0 //SCL = 0
#define SCL_DIR_OUT P4DIR|=BIT0
#define SDA_IN P4DIR&=~BIT1 //I/O口为输入
#define SDA_OUT P4DIR|=BIT1 //I/0口为输出
#define J_SDA_1_or_0 (P4IN&BIT1)==0x02
unsigned long int flag=0x0000;
//--------------------------------------------
//--------以下为24C64读写子函数
//DELAY 函数程序//功能:延时子程序
//==========================================
static void Delay(unsigned int n)
{
while(n!=0)
{n--;}
}
//=========================================
//START 函数程序
//功能:开始闪存操作
//==========================================
void Start(void)
{
SCL_DIR_OUT;
SDA_OUT;
SDA_1;
Delay(10);
SCL_1;
Delay(10);
SDA_0;
Delay(10);
SCL_0;
Delay(10);
}
//=========================================
//STOP 函数程序
//功能:停止闪存操作
//==========================================
void Stop(void)
{
SDA_0;
Delay(10);
SCL_1;
Delay(10);
SDA_1;
Delay(10);
}
void TX_Byte(unsigned char WriteData)
{
unsigned char i,j;
j=WriteData;
SDA_OUT;
for (i=0; i<8; i++)
{
if ((j&0x80)==0)
{ SDA_0;}
else
{ SDA_1;}
j <<=1;
Delay(10);
SCL_1;
Delay(10);
SCL_0;
Delay(10);
}
}
unsigned char RX_Byte(void)
{
unsigned char i;
unsigned char TempData = 0;
SDA_IN;
for (i=0; i<8; i++)
{
Delay(10);
SCL_1;
Delay(10);
TempData <<= 1;
if (J_SDA_1_or_0)
{ TempData++; }
SCL_0;
Delay(10);
}
SDA_OUT;
return(TempData);
}
//=========================================
//ACK 函数程序
//功能:挂高电平表示闪存时钟信号
//==========================================
void ReceiveAck(void)
{
SDA_IN;
SCL_1;
Delay(10);
while (J_SDA_1_or_0)
{ }
SCL_0;
SDA_OUT;
Delay(10);
}
unsigned char ReadWord(unsigned long int unit,unsigned char *s)
{
unsigned char i;
unsigned char LowAdd = 0;
unsigned char HighAdd = 0;
unsigned char TempData = 0;
LowAdd = (unsigned char)unit;
HighAdd = (unsigned char)(unit >> 8);
SDA_OUT;
Start();
TX_Byte(0xa0);
ReceiveAck();
TX_Byte(HighAdd);
ReceiveAck();
TX_Byte(LowAdd);
ReceiveAck();
Start();
TX_Byte(0xa1);
ReceiveAck();
for(i = 0;i<5;i++)
{
*s= RX_Byte();
*s++;
}
Stop();
Delay(8000);
return(TempData);
}
void WriteWord(unsigned long int unit, unsigned char *s)
{
unsigned char i;
unsigned char LowAdd = 0;
unsigned char HighAdd = 0;
LowAdd = (unsigned char)unit;
HighAdd = (unsigned char)(unit >> 8);
Start();
TX_Byte(0xa0);
ReceiveAck();
TX_Byte(HighAdd);
ReceiveAck();
TX_Byte(LowAdd);
ReceiveAck();
for(i = 0;i<5;i++)
{
TX_Byte(*s);
*s++;
}
Stop();
Delay(8000);
}
#endif
复制代码
结尾,再次感谢富士通半导体的样片。
图片附件:
原理图.png
(2014-8-20 22:51, 53.15 KB) / 下载次数 1040
http://bbs.eccn.com/attachment.php?aid=46361&k=14cf4bc25bbc523b75070a81f641a02f&t=1732236842&sid=N3UWlw
图片附件:
接线.png
(2014-8-20 22:51, 36.37 KB) / 下载次数 1002
http://bbs.eccn.com/attachment.php?aid=46362&k=fe45533923cdd7cd9654fbbbbc7bb738&t=1732236842&sid=N3UWlw
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0