搜索
bottom↓
回复: 8

fm25040 和at25040一样吗

[复制链接]

出0入4汤圆

发表于 2013-6-20 10:35:06 | 显示全部楼层 |阅读模式
    at25040找不到中文资料 。所以就用fm25040来看。   

fm25040是非易失铁电存储器。at25040是不是也是一样的

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出70入0汤圆

发表于 2013-6-20 10:44:18 | 显示全部楼层
FM是铁电的,AT好像就是普通的eeprom,铁电的好些也更贵,使用上应该差别不大。

出0入4汤圆

 楼主| 发表于 2013-6-20 11:30:50 | 显示全部楼层
绿茶山人 发表于 2013-6-20 10:44
FM是铁电的,AT好像就是普通的eeprom,铁电的好些也更贵,使用上应该差别不大。 ...

我主要的意思是问,操作起来是否一样的。也就是代码层面

出70入0汤圆

发表于 2013-6-20 14:06:22 | 显示全部楼层
huarana 发表于 2013-6-20 11:30
我主要的意思是问,操作起来是否一样的。也就是代码层面

时序你得看数据手册了,也就是改改时序参数

出0入0汤圆

发表于 2017-3-6 11:01:41 | 显示全部楼层
我也在使用AT25040,你调通了吗

出0入4汤圆

 楼主| 发表于 2017-3-6 11:14:33 | 显示全部楼层
陶新成 发表于 2017-3-6 11:01
我也在使用AT25040,你调通了吗

n年前的帖子了 - -

早就调通了。不复杂的。

出0入0汤圆

发表于 2017-3-6 11:25:33 | 显示全部楼层
huarana 发表于 2017-3-6 11:14
n年前的帖子了 - -

早就调通了。不复杂的。

我用时序模拟的收发,但是收到的数据总是0,

//   通过SPI发送数据                     
void data_sent(unsigned char data)
{
         unsigned char i=8;
   GPIO_ResetBits(GPIOA,GPIO_Pin_4);//CS低电平有效
         while(i)
         {
                  if((data&0x80)>>7) GPIO_SetBits(GPIOA,GPIO_Pin_6);//SO
                        else GPIO_ResetBits(GPIOA,GPIO_Pin_6);//SO
                  data<<=1;
                  Delay_Us_SPI(2);//1M
                  GPIO_SetBits(GPIOA,GPIO_Pin_5);//SCK
                  Delay_Us_SPI(2);//1M
                  GPIO_ResetBits(GPIOA,GPIO_Pin_5);//SCK
                  i--;     
   }
}


//  通过SPI接收数据  
unsigned char data_receive(void)
{
   unsigned char i=8;
   unsigned char data=0;
   while(i)
   {
                  Delay_Us_SPI(2);//1M
                  GPIO_SetBits(GPIOA,GPIO_Pin_5);//SCK
                 data<<=1;
                  if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)) data|0x01;
                  Delay_Us_SPI(2);//1M
                  GPIO_ResetBits(GPIOA,GPIO_Pin_5);//SCK
                 i--;
   }
   return(data);
}


//写入操作   
void write(void)
{
   unsigned int x;
   //使能片外EEPROM
         GPIO_ResetBits(GPIOA,GPIO_Pin_4);//CS低电平有效
   data_sent(0x06);
   delay();
         GPIO_SetBits(GPIOA,GPIO_Pin_4);//CS低电平有效
   delay();

   //向片外EEPROM写入数据
         GPIO_ResetBits(GPIOA,GPIO_Pin_4);//CS低电平有效
   data_sent(0x02);
   data_sent(0x00);
   for(x=0;x<5;x++)
    data_sent(datacun[x]);   //连续写入5个字节
   delay();
         GPIO_SetBits(GPIOA,GPIO_Pin_4);//CS低电平有效
}

// 读取操作
void read(void)
{
   unsigned int x;
   //由片外EEPROM读取数据  
         GPIO_ResetBits(GPIOA,GPIO_Pin_4);//CS低电平有效
   data_sent(0x03);
   data_sent(0x00);
   for(x=0;x<5;x++)
         {
      dataout[x] = data_receive();
                  USART_Byte_Send(USART1,dataout[x]);       
   }
         delay();
         GPIO_SetBits(GPIOA,GPIO_Pin_4);//CS低电平有效
}

出0入0汤圆

发表于 2017-3-6 11:30:56 | 显示全部楼层
你还有当初写的程序吗,能给我看一下吗

出0入4汤圆

 楼主| 发表于 2017-3-6 12:53:09 | 显示全部楼层
陶新成 发表于 2017-3-6 11:30
你还有当初写的程序吗,能给我看一下吗

我用的硬件spi啊 - -
很多年前写的了  比较菜 呵呵

  1. /************************************************/
  2. /* Update to TouchQin V1.0 by huarana        *********/       
  3. /* MCU: PIC16LF1933                *************************/                       
  4. /* 2013.6.24        *********************************/               
  5. /* 功能: SPI测试,使用SPI读写AT25040                *********/
  6. /************************************************/
  7. /* TouchQin V1.0  SPI测试程序,使用MSSP硬件SPI        */
  8. /* 使用单片机PIC16LF1933         *********************/
  9. /* 晶振:内部8M                *****************************/
  10. /* 显示:LED                *********************************/
  11. /* 编译环境 MPLAB IDE V8.85  ,PICC V9.83        *****/
  12. /* 参考MicroChip官网16F1784_SPI_EEPROM        *********/
  13. /* 时间:2013年6月24日        *************************/
  14. /* QQ:xx                *****************************/
  15. /************************************************/



  16. #include<pic.h>
  17. #include<pic16lf1933.h>
  18. #include<stdio.h>



  19. typedef  unsigned int uint;
  20. typedef         unsigned char uchar;


  21. /*************************************************************************************/
  22. /* 端口配置                                                                                                                                                        **/
  23. /**************************************************************************************/

  24. #define LED                                LATC                /*LED所在脚*/       
  25. #define CS_Eeprom            LATC0                /*SPI SS脚*/
  26. #define SPI_WP                        LATA6                /*SPI WP脚*/

  27. /*   PIC16LF1933   */
  28. __CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_OFF & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_OFF & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF);
  29. __CONFIG(WRT_OFF & PLLEN_OFF & STVREN_ON & BORV_LO & LVP_OFF);
  30.        

  31. /*************************************************************************************/
  32. /* 系统初始化                                                                                                                                                **/
  33. /**************************************************************************************/
  34. void SPI_init(void)
  35.                         {
  36.                                 OSCCON  = 0b01110000;        /*8M内部震荡*/
  37.                         //        OSCCON  = 0b01101000;        /*4M内部震荡*/
  38.                                 TRISA=0XBF;
  39.                                 TRISC=0x10;
  40.                                 TRISB=0X00;
  41.                                 ANSELA=0X00;
  42.                                 ANSELB=0x00;
  43.                                 LATB=0X00;
  44.                                 LATC0=1;
  45.                                 LATA6=1;
  46.                                 CKP = 0;    //1: 时钟高电平为空闲状态
  47.                                                         //0: 时钟低电平为空闲状态
  48.                                 CKE = 1;    //1:当时钟从有效状态变为空闲状态时开始发送
  49.                                                       //0:当时钟从空闲状态变为有效状态时开始发送
  50.        
  51.                                 SSPM3 =0;        /*        0000:时钟 = FOSC/4                */       
  52.                                 SSPM2 =0;        /*        0001:时钟 = FOSC/16                */
  53.                                 SSPM1 =0;        /*        0010:时钟 = FOSC/64                */
  54.                                 SSPM0 =0;        /*        0011:时钟 = TMR2输出/2        */                       
  55.                                                        
  56.                                 SMP =0;            //1:在数据输出时间的末尾采样输入数据
  57.                                                         //0:在数据输出时间的中间采样输入数据
  58.                        
  59.                                 SSPEN = 1;  //使能端口
  60.                         }
  61. /*************************************************************************************/
  62. /* ms延时                                                                                                                                                        **/
  63. /**************************************************************************************/
  64. void delay_ms(uint n)
  65.                         {
  66.                                 uchar i;
  67.                                 while(n--)
  68.                                         {
  69.                                                 for(i=0;i<150;i++);
  70.                                
  71.                                         }
  72.                         }


  73. /*************************************************************************************/
  74. /* us延时                                                                                                                                                        **/
  75. /**************************************************************************************/

  76. void delay(uint m)
  77.                         {
  78.                                 while(m--);
  79.                         }

  80. /*************************************************************************************/
  81. /* Send one byte to SEE                                                                                                                                **/
  82. /**************************************************************************************/
  83. void SSP_Send(uchar sByte)
  84.                         {
  85.                                 SSPBUF = sByte;
  86.                                 while(BF==0);
  87.                                
  88.                         }

  89. /**************************************************************************************/
  90. /* Read one byte from EEPROM                                                                                                                ***/
  91. /**************************************************************************************/
  92. uchar ReadSPI(void)
  93.                         {
  94.                             uchar databyte;
  95.                        
  96.                             SSPIF=0;                  // Clear SSP interrupt bit
  97.                          //        SSPBUF = 0x00;      // Write dummy data byte to the buffer to initiate transmission
  98.                             while(!BF);             // Wait for interrupt flag to go high indicating transmission is complete
  99.                             databyte = SSPBUF;  // Read the incoming data byte
  100.                             return (databyte);
  101.                         }

  102. /*************************************************************************************/
  103. /* Read the Status Register from the EEPROM                                                                                        **/
  104. /**************************************************************************************/
  105. uchar Read_SPI_StatusReg(void)
  106.                         {
  107.                             uchar data_read;
  108.                             CS_Eeprom=0;
  109.                             SSP_Send(0x05);         // Send read status register command
  110.                             data_read = ReadSPI();  // Read the data
  111.                             CS_Eeprom=1;
  112.                             return(data_read);
  113.                         }

  114. /*************************************************************************************/
  115. /* 在指定地址写入数据.....                                                                                                                        **/
  116. /**************************************************************************************/
  117. void write_DataToEeprom(uchar wAddr,uchar wData)
  118.                         {
  119.                                 uchar StatusReg;
  120.                                 CS_Eeprom = 0;
  121.                                 SSP_Send(0x06);          //写使能指令
  122.                                 CS_Eeprom = 1;           //这步必须要有,否则上面的写使能指令将无效
  123.                                 delay(20);                         //延时
  124.                                 CS_Eeprom = 0;           //
  125.                                 SSP_Send(0x02);          //写数据指令
  126.                                 SSP_Send(wAddr);          //
  127.                                 SSP_Send(wData);          // wData
  128.                                 delay_ms(20);                  //  
  129.                                 CS_Eeprom = 1;

  130.                                 do  /* using polling method*/
  131.                                     {
  132.                                       StatusReg = (Read_SPI_StatusReg() & 0x01);           // Read the Status Register and mask out   
  133.                                     }
  134.                                 while (StatusReg);                                             // the WIP bit (bit 0)

  135.                        
  136.                         }
  137. /*************************************************************************************/
  138. /* 读指定地址的数据.....                                                                                                                                **/
  139. /**************************************************************************************/
  140. uchar read_DataFromEeprom(uchar rAddr)
  141.                         {
  142.                                 uchar rData =0;
  143.                                 CS_Eeprom = 0;       
  144.                                 SSP_Send(0x03);                //读数据指令
  145.                                 SSP_Send(rAddr);        //
  146.                                  SSP_Send(0xFF);         //
  147.                                 delay(500);               //这个延时的时间可以很少,但必须要有
  148.                                 CS_Eeprom = 1;
  149.                                 rData=ReadSPI();        //调用读取
  150.                                 return rData;
  151.                         }
  152. /*************************************************************************************/
  153. /* 主函数.....                                                                                                                                                **/                                               
  154. /**************************************************************************************/
  155. void main(void)
  156.                         {
  157.                                 uchar addr1=0x01,data1=0x7F;                        /*设定写入地址及数据*/
  158.                                 uchar addr2=0x02,data2=0xBF;
  159.                                 uchar addr3=0x03,data3=0xFE;
  160.                                 uchar rData1=0,rData2=0,rData3=0;
  161.                                 SPI_init();                                                                /*初始化SPI*/
  162.                                 write_DataToEeprom(addr1,data1);                /*指定地址写入*/
  163.                                 delay_ms(50);
  164.                                  write_DataToEeprom(addr2,data2);                /*指定地址写入*/
  165.                                 delay_ms(50);
  166.                                 write_DataToEeprom(addr3,data3);                /*指定地址写入*/
  167.                                 delay_ms(50);                                                                                                       
  168.                                 rData1 = read_DataFromEeprom(addr1);        /*读出指定地址的值*/
  169.                                 delay_ms(50);
  170.                                 rData2 = read_DataFromEeprom(addr2);        /*读出指定地址的值*/
  171.                                 delay_ms(50);
  172.                                 rData3 = read_DataFromEeprom(addr3);        /*读出指定地址的值*/
  173.                                 delay_ms(50);                                                        /*重新初始化LED所在的IO口*/
  174.                                 TRISC=0X00;                                                                /*因为LED所在口和SPI复用*/
  175.                                 LED=0XFF;                                                                /*关闭所有LED灯                        */
  176.                                 while(1)
  177.                                         {
  178.                                                   LED=rData3;                                        /*按规律点亮LED来指示写入读出数据的正确*/
  179.                                                   delay_ms(500);                                /*可以通过修改初始data值来观察读写正确性*/
  180.                                                   LED=rData2;
  181.                                                   delay_ms(500);
  182.                                                   LED=rData1;
  183.                                                   delay_ms(500);
  184.                                         }
  185.                         }
复制代码
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 19:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表