4018|1

429

帖子

84

TA的资源

纯净的硅(初级)

LPC1752读取FM25L04B的原理与实现 [复制链接]

本帖最后由 rain_noise 于 2015-3-12 11:35 编辑

  • 硬件连接

    LPC1752通过SSP0与FM25L04B连接,P0.16为片选端。

    ee.jpg


    图1 LPC1752 与 FM25L04B 硬件连线图

  • 程序

LPC1752通过查询的方式读取FM25L04B。


2.1 初始化


初始化LPC1752的SSP0模块 ,按着如下步骤进行初始化的操作:


  • 在PCONP寄存器置位PCSSP0,允许SSP0模块的电源输出;
  • 在PCLK_SSP1寄存器中选择PCLK_SEL0,设置SSP0的时钟为CCLK/4;对SSP0的时钟进行分频,设置为CCLK/4/10;
  • 对LPC1752的管脚进行设置;
  • 设置 SPI 为主模式, FM25L04 工作在 SPI 模式 0。

  1. void LPC17xx_SPI_Init(void)
  2. {
  3.         volatile uint32_t dummy;

  4.         dummy = dummy;                                   /* avoid warning */

  5.   LPC_SC->PCONP |= (1 << 21);                      /* Enable power to SSPI0 block */
  6.         
  7.         /* PCLK_SSP0=CCLK */
  8.         LPC_SC->PCLKSEL1 &= ~(3<<10);                    /* PCLKSP0 = CCLK/4 (25MHz) */
  9.         LPC_SC->PCLKSEL1 |=  (1<<10);                    /* PCLKSP0 = CCLK   (100MHz) */        
  10.         
  11.         LPC17xx_SPI_SetSpeed (SPI_SPEED_10MHz);
  12.    
  13.   LPC_GPIO0->FIODIR |=  (1<<16);                   /* P0.16 CS is output */

  14.         /* P0.15 SCK, P0.17 MISO, P0.18 MOSI are SSP pins. */
  15.         LPC_PINCON->PINSEL0 &= ~( (2UL<<30) );                              /* P0.15  cleared */
  16.         LPC_PINCON->PINSEL1 &= ~( (2<<2) | (2<<4) );     /* P0.17, P0.18  cleared */
  17.         LPC_PINCON->PINSEL0 |=  ( (2UL<<30) );           /* P0.15 SCK0 */
  18.         LPC_PINCON->PINSEL1 |=  ( (2<<2) | (2<<4) );     /* P0.17 MISO0   P0.18 MOSI0 */

  19.         LPC_SSP0->CR0  = ( 7<<0 );                       /* 8Bit, CPOL=0, CPHA=0         */
  20.         LPC_SSP0->CR1  = ( 1<<1 );                       /* SSP0 enable, master          */
  21.                                          
  22.         /* wait for busy gone */
  23.         while( LPC_SSP0->SR & ( 1 << SSPSR_BSY ) );

  24.         /* drain SPI RX FIFO */
  25.         while( LPC_SSP0->SR & ( 1 << SSPSR_RNE ) )
  26.         {
  27.                 dummy = LPC_SSP0->DR;
  28.         }
  29. }
复制代码

2.2 读取
读取FM25L04B

ddd.jpg

图2 FM25L04B的读时序

  1. uint8_t FM25L04B_Read(uint32_t Dst, uint8_t* RcvBufPt, uint32_t NByte)
  2. {
  3.         uint8_t addr_a8;        
  4.         uint32_t i = 0;
  5. //        if ((Dst+NByte > MAX_ADDR)||(NByte == 0))        return (ERROR);        
  6.         addr_a8 = (Dst & 0xffffff00)>>5;
  7.         
  8.         SPI_FLASH_WP_UNLOCK();
  9.   SPI_FLASH_CS_LOW();
  10.         FM25L04B_ReadWriteByte(READ_CMD|addr_a8);
  11.         FM25L04B_ReadWriteByte(Dst & 0x00ff);                                         
  12.         for (i = 0; i < NByte; i++)               
  13.         {
  14.        RcvBufPt[i] = FM25L04B_ReadWriteByte(0xFF);               
  15.         }
  16.   SPI_FLASH_CS_HIGH();
  17.         SPI_FLASH_WP_LOCK();
  18.         
  19.         return 0;
  20. }
复制代码
2.3 写数据

dddddd.jpg


图3 FM25L04B的写时序

  1. uint8_t FM25L04B_Write(uint32_t Dst, uint8_t* SndbufPt,uint32_t NByte)
  2. {
  3.         uint8_t addr_a8;        
  4.         uint8_t temp = 0,StatRgVal = 0;
  5.         uint32_t i = 0;        
  6.         
  7. //        if (( (Dst+NByte-1 > MAX_ADDR)||(NByte == 0) ))
  8. //        {
  9. //                return (ERROR);         /*        ?????? */
  10. //        }
  11.         
  12.         addr_a8 = (Dst & 0xffffff00)>>5;
  13.         
  14.         SPI_FLASH_WP_UNLOCK();
  15.         SPI_FLASH_CS_LOW();                                 
  16.         FM25L04B_ReadWriteByte(RDSR_CMD);                                                           
  17.         temp = FM25L04B_ReadWriteByte(0xFF);                                          
  18.         SPI_FLASH_CS_HIGH();
  19.                                                                                        
  20.         for(i = 0; i < NByte; i++)
  21.         {        
  22.                 SPI_FLASH_CS_LOW();               
  23.                 FM25L04B_ReadWriteByte(WREN_CMD);        
  24.                 SPI_FLASH_CS_HIGH();        
  25.                
  26.                 SPI_FLASH_CS_LOW();                                       
  27.                 FM25L04B_ReadWriteByte(WRITE_CMD|addr_a8);                                          
  28.           FM25L04B_ReadWriteByte((Dst+i)& 0x00ff);         
  29.                 FM25L04B_ReadWriteByte(SndbufPt[i]);                                
  30.                 SPI_FLASH_CS_HIGH();                        

  31.                 do
  32.                 {
  33.                   SPI_FLASH_CS_LOW();                                         
  34.                         FM25L04B_ReadWriteByte(RDSR_CMD);                                          
  35.                         StatRgVal = FM25L04B_ReadWriteByte(0xFF);                        
  36.                         SPI_FLASH_CS_HIGH();                                                        
  37.                   }
  38.                 while (StatRgVal == 0x03 );                                                

  39.         }

  40.         SPI_FLASH_CS_LOW();                                 
  41.         FM25L04B_ReadWriteByte(WREN_CMD);                                                                                             
  42.         SPI_FLASH_CS_HIGH();                        
  43.                         
  44.         SPI_FLASH_CS_LOW();                                
  45.         FM25L04B_ReadWriteByte(WRSR_CMD);                                                         
  46.         FM25L04B_ReadWriteByte(temp);                                                     
  47.         SPI_FLASH_CS_HIGH();
  48.         SPI_FLASH_WP_LOCK();
  49.         
  50.         return 0;
  51. }
复制代码
2.4 测试代码

  1. uint8_t Recv_buf[16];
  2. uint8_t Send_buf[16] = {0x01,0x02,0x05,0xe4};

  3. int main(void)
  4. {
  5.         SystemInit();
  6.         
  7.         LPC17xx_SPI_Init();
  8.         
  9.         FM25L04B_Read(0x0,Recv_buf, sizeof(Recv_buf));
  10.         FM25L04B_Write(0x0,Send_buf, sizeof(Send_buf));
  11.         
  12.         memset(Recv_buf,0,sizeof(Recv_buf));
  13.         FM25L04B_Read(0x0,Recv_buf, sizeof(Recv_buf));
  14.         
  15.         while(1) ;
  16. }
复制代码


Code.rar (184 KB, 下载次数: 3, 售价: 2 分芯积分)
此帖出自NXP MCU论坛

最新回复

不错,给个精华。。。。。。  详情 回复 发表于 2015-3-12 13:10

赞赏

1

查看全部赞赏


回复
举报

4996

帖子

19

TA的资源

裸片初长成(初级)

不错,给个精华。。。。。。
此帖出自NXP MCU论坛
个人签名我的博客

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表