【晒FRAM铁电存储器样片】+四川省TI杯省赛集训FRAM应用
- UID
- 1032104
|
【晒FRAM铁电存储器样片】+四川省TI杯省赛集训FRAM应用
哈哈哈,首先非常感谢富士通半导体的样片,让我有幸体验到FRAM的好处。本人只是一个电子小菜鸟,今年有幸参加四川省TI省赛,在学校集训器件得到了mb85rc64样片,于是顺便就是用到当时的集训题目上了。“双相信号发生器”。话不多说,直接上原理图。
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);
- }
复制代码 下面是头文件。结尾,再次感谢富士通半导体的样片。 |
|
|
|
|
|