单片机解密GPIO模拟驱动W25Q16 FLASH源程序
单片机解密GPIO模拟驱动W25Q16 FLASH
程序代码应用到产品,非常稳定
单片机解密源程序如下:
- #include "_cpus.h"
- #include "_coms.h"
- /*=====================================================================================================================*/
- //SPI模式:CPOL=1 CPHA=1 CS Active low
- //clock is high when inactive
- //Data is valid on clock trailing edge
- //不活动时,时钟为高 也就是数据可改变区
- //数据在时钟后沿有效 数据作用点
- #define ENTER_CRITICAL()
-
- #define EXIT_CRITICAL()
-
- #define MOSI PC6
- #define SPSCK PC7
- #define ADD_EN_WP PC8
- #define MISO PC9
- #define SS PC10
-
- #define SS_OUT_L b_hGpioOut(SS,0)
- #define SS_OUT_H b_hGpioOut(SS,1)
-
- #define WP_OUT_L b_hGpioOut(ADD_EN_WP,0)
- #define WP_OUT_H b_hGpioOut(ADD_EN_WP,1)
- #define SPI_CLK b_hGpioOut(SPSCK,0);b_dNOP();b_dNOP();b_dNOP();b_dNOP();b_dNOP();b_hGpioOut(SPSCK,1);//和EE相位相反
- #define Flash_CS_0 b_hGpioOut(SPSCK,1); ENTER_CRITICAL();WP_OUT_H;SS_OUT_L;
- #define Flash_CS_1 WP_OUT_L;SS_OUT_H;EXIT_CRITICAL(); b_hGpioOut(SPSCK,0);
-
-
- void b_hExFlashSetChip2NomlPower(void);
- extern void b_hExFlashInit(void)
- {
- b_hGpioInit(SS,eOUT_PUSH_PULL,1);
- b_hGpioInit(SPSCK,eOUT_PUSH_PULL,0);
- b_hGpioInit(MOSI,eOUT_PUSH_PULL,0);
- b_hGpioInit(MISO,eOUT_PUSH_PULL,0);
-
- b_hGpioInit(ADD_EN_WP,eOUT_PUSH_PULL,0);
- b_hExFlashSetChip2NomlPower();
- }
- /*****************************************************************
- ** function name : SPISendByte
- ** description : SPI1 send one byte
- ** input parameter: byte to be sent
- ** return : byte received
- ******************************************************************/
- static uint08_t ExFlash_hSendByte(uint08_t b)
- {
- //时钟低到高输出,高到低输入
- //将b写到ee中,返回数据写到f中
- uint8_t i,f;
- f=0;
- // b_hGpioOut(SS,0);
- //SPI_SDI_DDR = IOisIN;
- b_hGpioInit(MISO,eIN_PULL_UP,0);
-
- //h_bGpioInit(SPSCK,eOUT_PUSH_PULL,0);
- //h_bGpioInit(MOSI,eOUT_PUSH_PULL,0);
- //SPI_SDI_UP=1; SPI_SCK_UP=1; SPI_SDO_UP=1;
- for(i=8;i;i--)
- {
- //TicksDelayMs(1);
- if(b&bit7){
- // SPI_SDO_ODR=1; /*向ee写1输出1p4.3*/
- b_hGpioOut(MOSI,1);
- }else{
- //SPI_SDO_ODR=0; /*向ee写0*/
- b_hGpioOut(MOSI,0);
- }
- SPI_CLK;
- // b_hGpioOut(SPSCK,0); //低到高跳变时钟
- // TicksDelayMs(1);
- // b_hGpioOut(SPSCK,1);
- // TicksDelayMs(1);
- b<<=1;
- f<<=1;
- if(b_hGpioRead(MISO))f|=bit0; /*接收数据*/
- }
- // SPI_SDO_UP=0; SPI_SCK_UP=0;SPI_SDI_DDR = IOisOUT;SPI_SDI_ODR= IOisLOW;SPI_SDI_UP=0;
- b_hGpioInit(MISO,eOUT_PUSH_PULL,0);
- //b_hGpioOut(SS,1);
- return f;
- }

芯片解密