独闷闷网

 找回密码
 立即注册
搜索
查看: 1067|回复: 0
收起左侧

[原创] 跟大家分享一个EPCS16的C语言驱动程序.其它EPCS4,EPCS64,EPCS128都大同小异.

[复制链接]
发表于 2016-5-7 21:10:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
★坚鸿-深圳:
今天为了实现FPGA的在线升级程序,刚刚终于搞出来了。要实现这个功能,我采用的方案就要编写SPI通讯的EPCS16芯片的驱动程序,这个芯片是一个FLASH芯片,专门用来装FPGA程序。FPGA每次上电时就自动从这个外围的FLASH芯片中快速读取并加载程序到FPGA内部。现在我决定把这个EPCS16的C语言驱动程序分享给大家。其它EPCS4,EPCS64,EPCS128都大同小异。

Epcs16.h头文件:
  1. #ifndef _EPCS16_
  2. #define _EPCS16_


  3. #define EPCS16_SPI_CS_ON()       GPIO_SetBits(GPIOF , GPIO_Pin_0)
  4. #define EPCS16_SPI_CS_OFF()      GPIO_ResetBits(GPIOF , GPIO_Pin_0)

  5. #define EPCS16_SPI_SCK_ON()      GPIO_SetBits(GPIOF , GPIO_Pin_1)
  6. #define EPCS16_SPI_SCK_OFF()     GPIO_ResetBits(GPIOF , GPIO_Pin_1)

  7. #define EPCS16_SPI_SI_ON()       GPIO_SetBits(GPIOF , GPIO_Pin_2)
  8. #define EPCS16_SPI_SI_OFF()      GPIO_ResetBits(GPIOF , GPIO_Pin_2)

  9. #define EPCS16_SPI_READ_SO()     GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_3)

  10. void Epcs16Initial(void);
  11. void Epcs16SendByte(u8 u8SendData);
  12. u8   Epcs16GetByte(void);
  13. void Epcs16WriteDisable(void);
  14. void Epcs16WriteEnable(void);
  15. void Epcs16CheckBusy(u16 u16TimeOut);   //注意,这里用到定时中断的延时,每1ms定时中断一次的累计时间。
  16. void Epcs16WriteStatus(u8 u8Epcs16Data);
  17. void Epcs16WriteByte(u32 u32Epcs16Addr,u8 u8Epcs16Data);
  18. u8   Epcs16ReadByte(u32 u32Epcs16Addr);
  19. void Epcs16EraseSector(u32 u32Epcs16Addr);
  20. void Epcs16EraseBulk(void);






  21. #endif


复制代码


Epcs16.c源文件:
  1. #include "stm32f4xx.h"
  2. #include  "Epcs16.h"
  3. #include "delay.h"



  4. void Epcs16Initial(void)
  5. {
  6.           GPIO_InitTypeDef  GPIO_InitStructure;
  7.           RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOF, ENABLE);                                                  
  8.        
  9.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 ;
  10.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  11.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  12.           GPIO_Init(GPIOF, &GPIO_InitStructure);
  13.        
  14.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  15.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  16.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  17.           GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
  18.           GPIO_Init(GPIOF, &GPIO_InitStructure);       
  19.        

  20.        
  21.     EPCS16_SPI_CS_ON();

  22. }


  23. void Epcs16SendByte(u8 u8SendData)
  24. {
  25.         u8 i=0;

  26.         for(i=0;i<8;i++)                  //8位数据串行输出
  27.         {

  28.     EPCS16_SPI_SCK_OFF();
  29.                 if(u8SendData&0x80)
  30.                 {
  31.         EPCS16_SPI_SI_ON();
  32.                 }
  33.                 else
  34.                 {
  35.         EPCS16_SPI_SI_OFF();
  36.                 }
  37.     u8Delay(1);
  38.                 u8SendData=u8SendData<<1;       
  39.     EPCS16_SPI_SCK_ON();
  40.     u8Delay(1);
  41.         }
  42. }

  43. u8 Epcs16GetByte(void)
  44. {
  45.         u8 u8GetData;
  46.         u8 i;
  47.        
  48.         for(i=0;i<8;i++)
  49.         {

  50.     EPCS16_SPI_SCK_OFF();
  51.     u8Delay(1);
  52.                 u8GetData=u8GetData<<1;
  53.     EPCS16_SPI_SCK_ON();
  54.     u8Delay(1);
  55.                 if(0!=EPCS16_SPI_READ_SO())                 //如果存储器输出高电平
  56.                 {
  57.                    u8GetData=u8GetData|0x01;
  58.                 }

  59.         }
  60.         return u8GetData;                         
  61. }


  62. void Epcs16WriteDisable(void)
  63. {
  64.                 EPCS16_SPI_CS_OFF();
  65.                 Epcs16SendByte(0x04);                 // 设置禁止写使能锁存
  66.                 EPCS16_SPI_CS_ON();

  67. }

  68. void Epcs16WriteEnable(void)
  69. {
  70.                 EPCS16_SPI_CS_OFF();
  71.                 Epcs16SendByte(0x06);                 // 设置写使能锁存
  72.                 EPCS16_SPI_CS_ON();
  73. }

  74. void Epcs16CheckBusy(u16 u16TimeOut) //注意,这里用到定时中断的延时,每1ms定时中断一次的累计时间。
  75. {

  76.         u8 u8ReadStatusData;
  77.        
  78.         Gu8DelayTimerFlag=0;  //注意,这里用到定时中断的延时,每1ms定时中断一次的累计时间。
  79.   Gu16DelayTimerCnt=u16TimeOut; //注意,这里用到定时中断的延时,每1ms定时中断一次的累计时间。
  80.         Gu8DelayTimerFlag=1; //注意,这里用到定时中断的延时,每1ms定时中断一次的累计时间。
  81.        
  82.         while(1)
  83.         {
  84.                 if(0==Gu16DelayTimerCnt)  //注意,这里用到定时中断的延时,每1ms定时中断一次的累计时间。
  85.                 {
  86.                    break;
  87.                 }
  88.                
  89.                 EPCS16_SPI_CS_OFF();
  90.                 Epcs16SendByte(0x05);    //获取存储器的状态
  91.                 u8ReadStatusData=Epcs16GetByte();
  92.           EPCS16_SPI_CS_ON();

  93.                
  94.                 if(0==(u8ReadStatusData&0x01))         //如果读出的最低位为1则表示存储器还在存储,此时单片机等待,知道存储完毕
  95.                 {
  96.                         break;
  97.                 }

  98.         }
  99.        
  100.         EPCS16_SPI_CS_ON();
  101. }

  102. void Epcs16WriteStatus(u8 u8Epcs16Data)
  103. {

  104.        
  105.   Epcs16WriteEnable();
  106.        
  107.         EPCS16_SPI_CS_OFF();
  108.         Epcs16SendByte(0x01);                 // 设置写状态指令
  109.         Epcs16SendByte(u8Epcs16Data);                 // 设置写状态数据
  110.         EPCS16_SPI_CS_ON();
  111.   Epcs16CheckBusy(15);

  112. }



  113. void Epcs16WriteByte(u32 u32Epcs16Addr,u8 u8Epcs16Data)
  114. {

  115.         u8 u8Addr=0;
  116.        
  117.   Epcs16WriteEnable();
  118.        
  119.         EPCS16_SPI_CS_OFF();
  120.         Epcs16SendByte(0x02);                //发送写数据指令

  121.         u8Addr=u32Epcs16Addr>>16;
  122.         Epcs16SendByte(u8Addr);                        //写入存储数据的地址
  123.         u8Addr=u32Epcs16Addr>>8;
  124.         Epcs16SendByte(u8Addr);                        //写入存储数据的地址
  125.         u8Addr=u32Epcs16Addr;
  126.         Epcs16SendByte(u8Addr);                        //写入存储数据的地址
  127.        
  128.         Epcs16SendByte(u8Epcs16Data);                        //写入待存储的数据
  129.        
  130.         EPCS16_SPI_CS_ON();
  131.   Epcs16CheckBusy(5);
  132. }


  133. u8 Epcs16ReadByte(u32 u32Epcs16Addr)
  134. {
  135.         u8 u8ReadData=0;
  136.         u8 u8Addr;
  137.        
  138.         EPCS16_SPI_CS_OFF();
  139.         Epcs16SendByte(0x03);                //首先向存储器发送读数据指令

  140.         u8Addr=u32Epcs16Addr>>16;
  141.         Epcs16SendByte(u8Addr);                        //写入存储数据的地址
  142.         u8Addr=u32Epcs16Addr>>8;
  143.         Epcs16SendByte(u8Addr);                        //写入存储数据的地址
  144.         u8Addr=u32Epcs16Addr;
  145.         Epcs16SendByte(u8Addr);                        //写入存储数据的地址
  146.        
  147.         u8ReadData=Epcs16GetByte();                   //读出数据
  148.        
  149.         EPCS16_SPI_CS_ON();

  150.         return u8ReadData;
  151. }

  152. void Epcs16EraseSector(u32 u32Epcs16Addr)
  153. {

  154.         u8 u8Addr;

  155.   Epcs16WriteStatus(0x02);
  156.        
  157.   Epcs16WriteEnable();
  158.        
  159.         EPCS16_SPI_CS_OFF();

  160.        
  161.         Epcs16SendByte(0xD8);                //首先向存储器发送擦除扇区指令

  162.         u8Addr=u32Epcs16Addr>>16;
  163.         Epcs16SendByte(u8Addr);                        //写入存储数据的地址
  164.         u8Addr=u32Epcs16Addr>>8;
  165.         Epcs16SendByte(u8Addr);                        //写入存储数据的地址
  166.         u8Addr=u32Epcs16Addr;
  167.         Epcs16SendByte(u8Addr);                        //写入存储数据的地址
  168.        
  169.         EPCS16_SPI_CS_ON();
  170.   Epcs16CheckBusy(3000);
  171.        

  172. }


  173. void Epcs16EraseBulk(void)
  174. {

  175.   Epcs16WriteStatus(0x02);

  176.   Epcs16WriteEnable();
  177.        
  178.         EPCS16_SPI_CS_OFF();

  179.        
  180.         Epcs16SendByte(0xC7);                //首先向存储器发送擦除整片指令


  181.         EPCS16_SPI_CS_ON();
  182.   Epcs16CheckBusy(40000);
  183.        

  184. }





复制代码


乐于分享,勇于质疑!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|独闷闷网 ( 粤ICP备12007667号-2 )

GMT+8, 2019-10-18 07:55 , Processed in 0.107650 second(s), 19 queries .

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