你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

铁电模块FM25CL64

[复制链接]
GKoSon 发布时间:2018-8-8 16:13
分享一个代码模块,网上找的一个STM32的SPI2通讯的FM25CL64历程,我自己结合自己的板子改成SPI1很快成功了。1FM25CL64确实简单,通讯和使用都比W25Q64容易
2写之前没有必要擦除 类似EEPROM
先看我板子原理图
QQ截图20180808160614.jpg
两个存储设备挂在SPI1上,CS脚铁电就是PA4
上代码:
  1. #ifndef __FM25CL64_H_
  2. #define __FM25CL64_H_                            
  3. #include "sys.h"


  4. #define        FM25CL64_CS                 PAout(4)                  //FM25CL64片选

  5. ////FM25CL64指令定义
  6. #define        FM25CL64_WREN                0x06                //使能
  7. #define        FM25CL64_WRDI                0x04                //失能
  8. #define        FM25CL64_RDSR                0x05                //读状态
  9. #define        FM25CL64_WRSR                0x01                //写状态
  10. #define        FM25CL64_READ                0x03                //读数据
  11. #define        FM25CL64_WRITE        0x02                //写数据

  12. void        fm25cl64_init(void);//初始化
  13. uint8_t        fm25cl64_read_sr(void);//读状态
  14. void fm25cl4_write_sr(uint8_t        sr);//写状态
  15. void fm25cl64_write_enable(void);//使能
  16. void fm25cl64_write_disable(void);//失能
  17. void fm25cl6_read_nbyte(uint8_t        *pbuff,        uint16_t read_addr,        uint16_t read_byte);//连续读取N个字节
  18. void fm25cl6_write_nbyte(uint8_t *pbuff, uint16_t write_addr, uint16_t write_byte);//连续写入N个字节
  19. uint8_t fm25cl6_read_1byte(uint16_t read_addr);//读取一个字节
  20. void fm25cl6_write_1byte(uint16_t write_addr, uint8_t write_data);//写入一个字节
  21. void fm25cl6_clear_data(uint16_t write_addr, uint8_t len);//清除LEN长度数据
  22. #endif









复制代码


  1. #include "fm25cl64.h"
  2. #include "spi.h"





  3. /*********************************************************************************************************
  4. **函数名称:        void        fm25cl64_init(void)
  5. **函数功能:fm25cl64初始化
  6. **入口参数:无
  7. **返回值:无
  8. **注释:
  9. **********************************************************************************************************/
  10. void        fm25cl64_init(void)
  11. {
  12.         GPIO_InitTypeDef GPIO_InitStructure;

  13.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );

  14.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;  
  15.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
  16.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  17.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  18.         GPIO_SetBits(GPIOA, GPIO_Pin_4);                       

  19.         FM25CL64_CS=1;                                //SPI FLASH不选中
  20.   SPI1_Init();                           //初始化SPI
  21.         SPI1_SetSpeed(SPI_BaudRatePrescaler_2);//设置为18M时钟,高速模式
  22. }

  23. /*********************************************************************************************************
  24. **函数名称:        fm25cl64_read_sr
  25. **函数功能:读取fm25cl64状态
  26. **入口参数:无
  27. **返回值:读取到的字节
  28. **注释:
  29. **********************************************************************************************************/
  30. uint8_t        fm25cl64_read_sr(void)
  31. {
  32.                 uint8_t        byte = 0;
  33.        
  34.                 FM25CL64_CS        = 0;                                                                                                //片选
  35.                 SPI1_ReadWriteByte(FM25CL64_RDSR);                //写入读状态命令
  36.                 byte = SPI1_ReadWriteByte(0xFF);                        //写一个空字节再读数据
  37.                 FM25CL64_CS        = 1;                                                                                                //取消片选
  38.        
  39.                 return        byte;                //返回数据
  40. }


  41. /*********************************************************************************************************
  42. **函数名称:        fm25cl64_write_sr
  43. **函数功能:写fm25cl64状态
  44. **入口参数:状态数据
  45. **返回值:无
  46. **注释:
  47. **********************************************************************************************************/
  48. void fm25cl4_write_sr(uint8_t        sr)
  49. {
  50.                 FM25CL64_CS        = 0;                //片选
  51.                 SPI1_ReadWriteByte(FM25CL64_WRSR);//写入写状态命令
  52.                 SPI1_ReadWriteByte(sr);        //写入状态数据
  53.                 FM25CL64_CS        = 1;                //取消片选
  54. }


  55. /*********************************************************************************************************
  56. **函数名称:        fm25cl64_write_enable
  57. **函数功能:使能FM25CL64
  58. **入口参数:无
  59. **返回值:无
  60. **注释:
  61. **********************************************************************************************************/
  62. void fm25cl64_write_enable(void)
  63. {
  64.                 FM25CL64_CS        = 0;//片选
  65.                 SPI1_ReadWriteByte(FM25CL64_WREN);//写入写使能命令
  66.                 FM25CL64_CS        =        1;//取消片选
  67. }


  68. /*********************************************************************************************************
  69. **函数名称:        fm25cl64_write_disable
  70. **函数功能:失能FM25CL64
  71. **入口参数:无
  72. **返回值:无
  73. **注释:
  74. **********************************************************************************************************/
  75. void fm25cl64_write_disable(void)
  76. {
  77.                 FM25CL64_CS = 0;//片选
  78.                 SPI1_ReadWriteByte(FM25CL64_WRDI);//写入写失能命令
  79.                 FM25CL64_CS        = 1;//取消片选
  80. }


  81. /*********************************************************************************************************
  82. **函数名称:        fm25cl6_read_nbyte
  83. **函数功能:连续读取N字节数据
  84. **入口参数:*pbuff,读取数据到指针,,read_addr,读数据首址,,read_byte,读多少字节
  85. **返回值:无
  86. **注释:
  87. **********************************************************************************************************/
  88. void fm25cl6_read_nbyte(uint8_t        *pbuff,        uint16_t read_addr,        uint16_t read_byte)
  89. {
  90.                         uint16_t        i;
  91.        
  92.        
  93.                         FM25CL64_CS        =        0;//片选
  94.                         SPI1_ReadWriteByte(FM25CL64_READ);//写入读数据命令
  95.                         SPI1_ReadWriteByte((uint8_t)((read_addr&0xE0)>>8));//写入高8位址,最大地址13位
  96.                         SPI1_ReadWriteByte((uint8_t)(read_addr));//写入低8位址,
  97.                        
  98.                         for(i=0;i<read_byte;i++)//连续读取数据
  99.                         {
  100.                                         pbuff[i] = SPI1_ReadWriteByte(0xFF);
  101.                         }
  102.                         FM25CL64_CS        =        1;//取消片选

  103.                
  104. }


  105. /*********************************************************************************************************
  106. **函数名称:        fm25cl6_write_nbyte
  107. **函数功能:连续写入N字节数据
  108. **入口参数:*pbuff,写入的数据指针,,write_addr,写入数据首址,,write_byte写多少字节
  109. **返回值:无
  110. **注释:
  111. **********************************************************************************************************/
  112. void fm25cl6_write_nbyte(uint8_t *pbuff, uint16_t write_addr, uint16_t write_byte)
  113. {
  114.                         uint16_t        i;

  115.        
  116.                         fm25cl64_write_enable();//使能写操作,一定要先使能,取消片选后再写作下面操作
  117.        
  118.                         FM25CL64_CS        =        0;//片选
  119.                        
  120.                         SPI1_ReadWriteByte(FM25CL64_WRITE);//写数据命令
  121.                         SPI1_ReadWriteByte((uint8_t)((write_addr&0xE0)>>8));//写入高8位址,最大地址13位
  122.                         SPI1_ReadWriteByte((uint8_t)(write_addr));//写入低8位址,
  123.        
  124.                         for(i=0;i<write_byte;i++)//连续写入数据
  125.                         {
  126.                                         SPI1_ReadWriteByte(pbuff[i]);
  127.                         }
  128.                         FM25CL64_CS        =        1;//取消片选
  129. }



  130. /*********************************************************************************************************
  131. **函数名称:        fm25cl6_read_data_1byte
  132. **函数功能:读1字节数据
  133. **入口参数:read_addr,读取数据地址
  134. **返回值:返回读取的数据
  135. **注释:
  136. **********************************************************************************************************/
  137. uint8_t fm25cl6_read_1byte(uint16_t read_addr)
  138. {
  139.                         uint8_t        dat;
  140.        
  141.                         FM25CL64_CS        =        0;//片选
  142.        
  143.                         SPI1_ReadWriteByte(FM25CL64_READ);//写入读数据命令
  144.                         SPI1_ReadWriteByte((uint8_t)((read_addr)>>8));//最大地址13位
  145.                         SPI1_ReadWriteByte((uint8_t)(read_addr));//
  146.        
  147.                         dat = SPI1_ReadWriteByte(0xFF);//读一字节数据

  148.                         FM25CL64_CS        =        1;//取消片选

  149.                         return        dat;
  150. }


  151. /*********************************************************************************************************
  152. **函数名称:        fm25cl6_read_data_1byte
  153. **函数功能:写入1字节数据
  154. **入口参数:write_addr,写入数据地址,,write_data,写入的数据
  155. **返回值:无
  156. **注释:
  157. **********************************************************************************************************/
  158. void fm25cl6_write_1byte(uint16_t write_addr, uint8_t write_data)
  159. {

  160.        
  161.                         fm25cl64_write_enable();//使能写操作,一定要先使能,取消片选后再写作下面操作
  162.        
  163.        
  164.                         FM25CL64_CS        =        0;//片选
  165.        
  166.                         SPI1_ReadWriteByte(FM25CL64_WRITE);//写数据命令
  167.                         SPI1_ReadWriteByte((uint8_t)((write_addr)>>8));//最大地址13位
  168.                         SPI1_ReadWriteByte((uint8_t)(write_addr));//
  169.        

  170.                         SPI1_ReadWriteByte(write_data);//写一字节数据

  171.                         FM25CL64_CS        =        1;//取消片选
  172. }


  173. /*********************************************************************************************************
  174. **函数名称:        fm25cl6_clear_data
  175. **函数功能:清除指定长度数据
  176. **入口参数:write_addr,清除数据地址,,len,清除的数据长度
  177. **返回值:无
  178. **注释:
  179. **********************************************************************************************************/
  180. void fm25cl6_clear_data(uint16_t write_addr, uint8_t len)
  181. {

  182.        
  183.                         fm25cl64_write_enable();//使能写操作,一定要先使能,取消片选后再写作下面操作
  184.        
  185.        
  186.                         FM25CL64_CS        =        0;//片选
  187.        
  188.                         SPI1_ReadWriteByte(FM25CL64_WRITE);//写数据命令
  189.                         SPI1_ReadWriteByte((uint8_t)((write_addr)>>8));//最大地址13位
  190.                         SPI1_ReadWriteByte((uint8_t)(write_addr));//
  191.        
  192.                         while(len--)
  193.                         {
  194.                                 SPI1_ReadWriteByte(0x00);//
  195.                         }
  196.                        
  197.                         FM25CL64_CS        =        1;//取消片选
  198. }











复制代码
其实如果面向接口编程,模块调用SPI的函数SPI1_ReadWriteByte还可以抽象,以备可以切换为SPIX_ReadWriteByte。

测试代码
  1. fm25cl64_init();
  2.         fm25cl6_write_1byte(0,0xAB);
  3.         GG=fm25cl6_read_1byte(0);
  4. //        fm25cl6_clear_data(0,1);
  5.         fm25cl6_write_1byte(0,0xCD);
  6.         GG=fm25cl6_read_1byte(0);
复制代码


收藏 3 评论2 发布时间:2018-8-8 16:13

举报

2个回答
x5y4z3 回答时间:2018-8-9 09:50:00
楼主连驱动代码都附上了,真是很给力!!
十多年来一ˊ直在用 24C64 的 FRAM 路过...
yangjiaxu 回答时间:2018-8-10 15:49:43
模拟SPI就行 铁电的应该不难

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版