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

【经验分享】STM32驱动AT25640,带源码

[复制链接]
STMCU小助手 发布时间:2022-4-22 22:00
  1. #include "eeprom.h"


  2. void eeprom_init()
  3. {
  4.         GPIO_InitTypeDef  GPIO_InitStructure;
  5.         SPI_InitTypeDef  SPI_InitStructure;

  6.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOB时钟
  7.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);//使能SPI1时钟

  8.         //GPIOFB3,4,5初始化设置
  9.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;//PB3~5复用功能输出        
  10.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
  11.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  12.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  13.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  14.         GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化
  15.         
  16.         //GPIOFB3,4,5初始化设置
  17.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PB3~5复用功能输出        
  18.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
  19.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  20.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  21.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  22.         GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化        
  23.         
  24.         //GPIOFB3,4,5初始化设置
  25.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;//PB3~5复用功能输出        
  26.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//复用功能
  27.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  28.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  29.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  30.         GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化        
  31.         GPIO_SetBits(GPIOE,GPIO_Pin_2|GPIO_Pin_3);        

  32.         GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_SPI2); //PB3复用为 SPI1
  33.         GPIO_PinAFConfig(GPIOC,GPIO_PinSource2,GPIO_AF_SPI2); //PB4复用为 SPI1
  34.         GPIO_PinAFConfig(GPIOC,GPIO_PinSource3,GPIO_AF_SPI2); //PB5复用为 SPI1

  35.         //这里只针对SPI口初始化
  36.         RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,ENABLE);//复位SPI1
  37.         RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,DISABLE);//停止复位SPI1

  38.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
  39.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //设置SPI工作模式:设置为主SPI
  40.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //设置SPI的数据大小:SPI发送接收8位帧结构
  41.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //串行同步时钟的空闲状态为高电平
  42.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
  43.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
  44.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;                //定义波特率预分频的值:波特率预分频值为256
  45.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
  46.         SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值计算的多项式
  47.         SPI_Init(SPI2, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

  48.         SPI_Cmd(SPI2, ENABLE); //使能SPI外设

  49. ///        eeprom_read_write_byte(0xff);//启动传输        
  50. }
  51. //SPI 速度设置函数
  52. //SpeedSet:
  53. //SPI_BaudRatePrescaler_2   2分频   
  54. //SPI_BaudRatePrescaler_8   8分频   
  55. //SPI_BaudRatePrescaler_16  16分频  
  56. //SPI_BaudRatePrescaler_256 256分频

  57. void eeprom_set_speed(u8 SPI_BaudRatePrescaler)
  58. {
  59.   assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));//判断有效性
  60.         SPI2->CR1&=0XFFC7;//位3-5清零,用来设置波特率
  61.         SPI2->CR1|=SPI_BaudRatePrescaler;        //设置SPI1速度
  62.         SPI_Cmd(SPI2,ENABLE); //使能SPI1

  63. }

  64. //SPIx 读写一个字节
  65. //TxData:要写入的字节
  66. //返回值:读取到的字节
  67. u8 eeprom_read_write_byte(u8 TxData)
  68. {               
  69.         while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET){}//等待发送区空  

  70.         SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个byte  数据

  71.         while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET){} //等待接收完一个byte  

  72.         return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据                                    
  73. }

  74. //==============================================================================
  75. // 描述: 在AT25读状态寄存器
  76. // 输入: 无
  77. // 返回: unsigned char dat 状态寄存器数据
  78. //==============================================================================


  79. u8 eeprom_read_sr(void)
  80. {
  81.         u8 dat;
  82.         eeprom_cs=0;
  83.         eeprom_read_write_byte(RDSR);        //  定入指令0x05
  84.         dat = eeprom_read_write_byte(0xff);       //  读回数据
  85.         eeprom_cs=1;
  86.         return  dat;
  87. }

  88. //==============================================================================
  89. // 描述: 向AT25写入一个数据
  90. // 输入: unsigned char Dat 字符数据
  91. //       unsigned int addr 写入的地址
  92. // 返回: 无
  93. //==============================================================================
  94. void eeprom_write_byte(u16 addr,u8 Dat)
  95. {
  96.         unsigned char Add;
  97.         while(eeprom_read_sr()&RDY);                   // 读状态寄存器
  98.         
  99.         eeprom_cs=0;
  100.         eeprom_read_write_byte(WREN);                           // 写使能锁存
  101.         eeprom_cs=1;
  102.         
  103.         eeprom_cs=0;                                  // 芯片使能
  104.         // 写入写操作指令
  105.         if(addr>0x00ff)
  106.                 eeprom_read_write_byte((WRITE|0x08));           // 地址大于255
  107.         else
  108.                 eeprom_read_write_byte(WRITE);                  // 地址小于255

  109.         // 写入地址
  110.         Add = (unsigned char)(addr & 0xff);             // 将地址换成8位
  111.         eeprom_read_write_byte(Add);

  112.         // 写入数据
  113.         eeprom_read_write_byte(Dat);
  114.         eeprom_cs=1;                                // 芯片关闭   
  115. }
  116. //==============================================================================
  117. // 描述: 在AT25读一个字节操作
  118. // 输入: 无
  119. // 返回: unsigned char dat 读出一个字符数据
  120. //==============================================================================
  121. u8 eeprom_read_byte(u16 addr)
  122. {
  123.         u8 dat,add;
  124.         while(eeprom_read_sr()&RDY);                   // 读状态寄存器  
  125.         eeprom_cs=0;
  126.         // 写入写操作指令
  127.         if(addr>0x00ff)
  128.                 eeprom_read_write_byte((READ | 0x08));         // 地址大于255
  129.         else
  130.                 eeprom_read_write_byte(READ);                  // 地址小于255

  131.         // 写入地址
  132.         add = (unsigned char)(addr & 0xff);             // 将地址换成8位
  133.         eeprom_read_write_byte(add);

  134.         // 读出一个数据
  135.         dat=eeprom_read_write_byte(0xff);
  136.         eeprom_cs=1;
  137.         return dat;
  138. }
  139. //==============================================================================
  140. // 描述: 向AT25连续写入数据
  141. // 输入: unsigned char *PC 写入数据指针
  142. //       unsigned int count 写入数量计数  
  143. //       unsigned int SatAddr 写入起始地址
  144. // 返回: 无
  145. //==============================================================================
  146. void eeprom_write_buf(u16 startAddr,u8 *buf,u16 count)
  147. {
  148.         u16 i;
  149.         while(eeprom_read_sr()&RDY);                   // 读状态寄存器

  150.         eeprom_cs=0;
  151.         eeprom_read_write_byte(WREN);                           // 写使能锁存
  152.         eeprom_cs=1;
  153.         eeprom_cs=0;
  154.         
  155.         eeprom_read_write_byte(WRITE);                        // 写入写操作指令
  156.         eeprom_read_write_byte(startAddr>>8);                 // 写入地址
  157.         eeprom_read_write_byte(startAddr);

  158.         for(i=0;i<count;i++)// 写入数据
  159.         {
  160.                 eeprom_read_write_byte(*buf++);
  161.         }
  162.         eeprom_cs=1;                                 // 芯片关闭   
  163. }
  164. //==============================================================================
  165. // 描述: 向AT25连续写入n字节的数据
  166. // 输入: unsigned char *PC 写入数据指针
  167. //       unsigned int count 写入数量计数  
  168. //       unsigned int SatAddr 写入起始地址
  169. // 返回: 无
  170. //==============================================================================
  171. void eeprom_write_nbyte(u16 startAddr,u8 *buf,u16 count)
  172. {
  173.         u16 pageTotal=count/64;
  174.         u16 pageResidue=count%64;
  175.         u16 i;
  176.         u16 pageCnt=0;
  177.         
  178.         for(i=0;i<pageTotal;i++)
  179.         {
  180.                 eeprom_write_buf(startAddr+pageCnt,&buf[pageCnt],64);
  181.                 pageCnt+=64;
  182.         }
  183.         eeprom_write_buf(startAddr+pageCnt,&buf[pageCnt],pageResidue); //写入剩余的
  184. }


  185. //==============================================================================
  186. // 描述: 在AT25连续读数据
  187. // 输入: unsigned char *PC 读出数据指针
  188. //       unsigned int count 读出数量计数  
  189. //       unsigned int SatAddr 读出起始地址
  190. // 返回: 无
  191. //==============================================================================
  192. void eeprom_read_buf(u16 startAddr,u8 *buf,u16 count)
  193. {
  194.         unsigned int i;
  195.         while(eeprom_read_sr()&RDY);                   // 读状态寄存器  
  196.         eeprom_cs=0;
  197.         
  198.         eeprom_read_write_byte(READ);       // 写入读操作指令           
  199.         // 写入地址
  200.         eeprom_read_write_byte(startAddr>>8);
  201.         eeprom_read_write_byte(startAddr);

  202.         // 读出n个数据
  203.         for(i=0;i<count;i++)
  204.         {
  205.                 *buf++ = eeprom_read_write_byte(0xff);
  206.         }
  207.         eeprom_cs=1;
  208. }


复制代码

收藏 评论0 发布时间:2022-4-22 22:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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