查看: 5491|回复: 2

[原创] 放大招了,FSL-DSPI和SPI驱动SPIFLASH的源代码

[复制链接]
  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
    发表于 2016-6-27 13:15:01 | 显示全部楼层 |阅读模式
    本帖最后由 技术范儿 于 2016-6-27 14:24 编辑

    还在为玩转你的四色板还烦恼吗?技术放大招了,飞思卡尔的DSPI和SPI驱动W25QXX,SPIFLASH的代码,测试通过,用的拿走,不谢!
    1. #ifndef __W25QXX_H
    2. #define __W25QXX_H

    3. #include "spi.h"


    4. #define W25Q80         0X1451         
    5. #define W25Q16         0XEF14
    6. #define W25Q32         0XEF15
    7. #define W25Q64         0XEF16
    8. #define W25Q128        0XEF17

    9. #define W25QXX_CS_Low  SPI0_CS_Low
    10. #define W25QXX_CS_High SPI0_CS_High
    11. extern uint16_t W25QXX_TYPE;                                        //定义W25QXX芯片型号                  

    12. #define        W25QXX_CS                 PBout(12)                  //W25QXX的片选信号
    13.                                  
    14. ////////////////////////////////////////////////////////////////////////////

    15. //指令表
    16. #define W25X_WriteEnable                0x06
    17. #define W25X_WriteDisable                0x04
    18. #define W25X_ReadStatusReg                0x05
    19. #define W25X_WriteStatusReg                0x01
    20. #define W25X_ReadData                        0x03
    21. #define W25X_FastReadData                0x0B
    22. #define W25X_FastReadDual                0x3B
    23. #define W25X_PageProgram                0x02
    24. #define W25X_BlockErase                        0xD8
    25. #define W25X_SectorErase                0x20
    26. #define W25X_ChipErase                        0xC7
    27. #define W25X_PowerDown                        0xB9
    28. #define W25X_ReleasePowerDown        0xAB
    29. #define W25X_DeviceID                        0xAB
    30. #define W25X_ManufactDeviceID        0x90
    31. #define W25X_JedecDeviceID                0x9F


    32. uint16_t  W25QXX_ReadID(void);                              //读取FLASH ID
    33. uint8_t W25QXX_ReadByte(uint32_t ReadAdress);
    34. void W25QXX_Read(uint8_t* pBuffer,uint32_t ReadAddr,uint16_t NumByteToRead);
    35. uint8_t W25QXX_ReadSR(void) ;
    36. void W25QXX_Write_SR(uint8_t sr);
    37. void W25QXX_Write_Enable(void);
    38. void W25QXX_Write_Disable(void);
    39. void W25QXX_Write_Page(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite);
    40. void W25QXX_Write_NoCheck(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite);
    41. void W25QXX_Write(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite);
    42. void W25QXX_Erase_Sector(uint32_t Dst_Addr);

    43. #endif
    复制代码
    1. uint16_t W25QXX_ReadID(void)
    2. {
    3.         uint16_t Temp = 0;
    4.     uint8_t a,b;
    5.     SPI_ReadWriteByte (0x00);//BUG
    6.     W25QXX_CS_Low ;
    7.     SPI_ReadWriteByte (0x90);
    8.     SPI_ReadWriteByte (0x00);
    9.     SPI_ReadWriteByte (0x00);
    10.     SPI_ReadWriteByte (0x00);
    11.     Temp|=SPI_ReadWriteByte(0xFF)<<8;  
    12.         Temp|=SPI_ReadWriteByte(0xFF);
    13.     W25QXX_CS_High;
    14.         return Temp;
    15. }  



    16. /************************************************************
    17. * 函数名称:uint8_t W25QXX_ReadSR(void)
    18. * 函数功能:读取W25QXX状态寄器
    19. * 入口参数:
    20. * 出口参数:
    21. * 函数说明:
    22. ************************************************************/
    23. uint8_t W25QXX_ReadSR(void)   
    24. {  
    25.         uint8_t byte=0;   
    26.         SPI_ReadWriteByte (0x00);//BUG   
    27.         W25QXX_CS_Low;                            //????   
    28.         SPI_ReadWriteByte(W25X_ReadStatusReg); //???????????   
    29.         byte=SPI_ReadWriteByte(0Xff);          //??????  
    30.         W25QXX_CS_High;                            //????     
    31.         return byte;   
    32. }

    33. /************************************************************
    34. * 函数名称:void W25QXX_Write_SR(uint8_t sr)  
    35. * 函数功能:写W25QXX状态寄器
    36. * 入口参数:
    37. * 出口参数:
    38. * 函数说明:只有SPR,TB,BP2,BP1,BP0(bit 7,5,4,3,2)可以写!!
    39. ************************************************************/
    40. void W25QXX_Write_SR(uint8_t sr)   
    41. {   
    42.         SPI_ReadWriteByte (0x00); //BUG   
    43.         W25QXX_CS_Low;                             //????   
    44.         SPI_ReadWriteByte(W25X_WriteStatusReg);//???????????   
    45.         SPI_ReadWriteByte(sr);                       //??????  
    46.         W25QXX_CS_High;                            //????                  
    47. }   

    48. /************************************************************
    49. * 函数名称:void W25QXX_Write_Enable(void)   
    50. * 函数功能:W25QXX写允许
    51. * 入口参数:
    52. * 出口参数:
    53. * 函数说明:
    54. ************************************************************/
    55. void W25QXX_Write_Enable(void)   
    56. {
    57.         SPI_ReadWriteByte (0x00);  //BUG  
    58.         W25QXX_CS_Low;                                  //????   
    59.     SPI_ReadWriteByte(W25X_WriteEnable);         //?????  
    60.         W25QXX_CS_High;                                     //????                  
    61. }

    62. /************************************************************
    63. * 函数名称:void W25QXX_Write_Disable(void)   
    64. * 函数功能:W25QXX禁止写
    65. * 入口参数:
    66. * 出口参数:
    67. * 函数说明:
    68. ************************************************************/
    69. void W25QXX_Write_Disable(void)   
    70. {  
    71.         SPI_ReadWriteByte (0x00);    //BUG
    72.         W25QXX_CS_Low;                             //????   
    73.     SPI_ReadWriteByte(W25X_WriteDisable);  //???????   
    74.         W25QXX_CS_High;                            //????                  
    75. }

    76. /************************************************************
    77. * 函数名称:void W25QXX_Read(uint8_t* pBuffer,uint32_t ReadAddr,uint16_t NumByteToRead)   
    78. * 函数功能:W25QXX读
    79. * 入口参数:pBuff:数据存储区-ReadAddr:24bit地址--NumByteToRead:要读取的字节数(最大65535)
    80. * 出口参数:
    81. * 函数说明:
    82. ************************************************************/
    83. void W25QXX_Read(uint8_t* pBuffer,uint32_t ReadAddr,uint16_t NumByteToRead)   
    84. {
    85.         uint16_t i;                                                                                       
    86.         SPI_ReadWriteByte (0x00); //BUG   
    87.         W25QXX_CS_Low;                                    //????   
    88.     SPI_ReadWriteByte(W25X_ReadData);                 //??????   
    89.     SPI_ReadWriteByte((uint8_t)((ReadAddr)>>16));          //??24bit??   
    90.     SPI_ReadWriteByte((uint8_t)((ReadAddr)>>8));   
    91.     SPI_ReadWriteByte((uint8_t)ReadAddr);   
    92.     for(i=0;i<NumByteToRead;i++)
    93.         {
    94.         pBuffer=SPI_ReadWriteByte(0XFF);           //????  
    95.     }
    96.         W25QXX_CS_High;                                                   
    97. }  

    98. /************************************************************
    99. * 函数名称:void W25QXX_Write_Page(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite)   
    100. * 函数功能:W25QXX页写
    101. * 入口参数:pBuff:数据存储区-ReadAddr:24bit地址--NumByteToRead:要写入的字节数(最大256)
    102. * 出口参数:
    103. * 函数说明:
    104. ************************************************************/
    105. void W25QXX_Write_Page(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite)
    106. {
    107.         uint16_t i;  
    108.     W25QXX_Write_Enable();                          //SET WEL
    109.         SPI_ReadWriteByte (0x00); //BUG   
    110.         W25QXX_CS_Low;                                    //????   
    111.     SPI_ReadWriteByte(W25X_PageProgram);              //??????   
    112.     SPI_ReadWriteByte((uint8_t)((WriteAddr)>>16));         //??24bit??   
    113.     SPI_ReadWriteByte((uint8_t)((WriteAddr)>>8));   
    114.     SPI_ReadWriteByte((uint8_t)WriteAddr);   
    115.     for(i=0;i<NumByteToWrite;i++)SPI_ReadWriteByte(pBuffer);//????  
    116.         W25QXX_CS_High;                                    //????
    117.         W25QXX_Wait_Busy();                                                           //??????
    118. }

    119. /************************************************************
    120. * 函数名称:25QXX_Write_NoCheck(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite)     
    121. * 函数功能:无校验写W25QXX
    122. * 入口参数:pBuff:数据存储区-ReadAddr:24bit地址--NumByteToRead:要写入的字节数(最大65535)
    123. * 出口参数:
    124. * 函数说明:
    125. ************************************************************/
    126. void W25QXX_Write_NoCheck(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite)   
    127. {                                          
    128.         uint16_t pageremain;           
    129.         pageremain=256-WriteAddr%256; //????????                             
    130.         if(NumByteToWrite<=pageremain)pageremain=NumByteToWrite;//???256???
    131.         while(1)
    132.         {           
    133.                 W25QXX_Write_Page(pBuffer,WriteAddr,pageremain);
    134.                 if(NumByteToWrite==pageremain)break;//?????
    135.                  else //NumByteToWrite>pageremain
    136.                 {
    137.                         pBuffer+=pageremain;
    138.                         WriteAddr+=pageremain;        

    139.                         NumByteToWrite-=pageremain;                          //???????????
    140.                         if(NumByteToWrite>256)pageremain=256; //??????256???
    141.                         else pageremain=NumByteToWrite;           //??256????
    142.                 }
    143.         };            
    144. }
    145. /************************************************************
    146. * 函数名称:W25QXX_Write(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite)   
    147. * 函数功能:写SPI Flash
    148. * 入口参数:pBuff:数据存储区-ReadAddr:24bit地址--NumByteToRead:要写入的字节数(最大65535)
    149. * 出口参数:
    150. * 函数说明:
    151. ************************************************************/
    152. uint8_t W25QXX_BUFFER[4096];                 
    153. void W25QXX_Write(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite)   
    154. {
    155.         uint32_t secpos;
    156.         uint16_t secoff;
    157.         uint16_t secremain;           
    158.         uint16_t i;   
    159.         uint8_t * W25QXX_BUF;         
    160.            W25QXX_BUF=W25QXX_BUFFER;            
    161.         secpos=WriteAddr/4096;//????  
    162.         secoff=WriteAddr%4096;//???????
    163.         secremain=4096-secoff;//????????   
    164.         //printf("ad:%X,nb:%X\r\n",WriteAddr,NumByteToWrite);//???
    165.         if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//???4096???
    166.         while(1)
    167.         {        
    168.                 W25QXX_Read(W25QXX_BUF,secpos*4096,4096);//?????????
    169.                 for(i=0;i<secremain;i++)//????
    170.                 {
    171.                         if(W25QXX_BUF[secoff+i]!=0XFF)break;//????            
    172.                 }
    173.                 if(i<secremain)//????
    174.                 {
    175.                         W25QXX_Erase_Sector(secpos);                //??????
    176.                         for(i=0;i<secremain;i++)                           //??
    177.                         {
    178.                                 W25QXX_BUF[i+secoff]=pBuffer;         
    179.                         }
    180.                         W25QXX_Write_NoCheck(W25QXX_BUF,secpos*4096,4096);//??????  

    181.                 }else W25QXX_Write_NoCheck(pBuffer,WriteAddr,secremain);//???????,??????????.                                    
    182.                 if(NumByteToWrite==secremain)break;//?????
    183.                 else//?????
    184.                 {
    185.                         secpos++;//?????1
    186.                         secoff=0;//?????0         

    187.                            pBuffer+=secremain;                                  //????
    188.                         WriteAddr+=secremain;                                //?????           
    189.                            NumByteToWrite-=secremain;                        //?????
    190.                         if(NumByteToWrite>4096)secremain=4096;//??????????
    191.                         else secremain=NumByteToWrite;                //??????????
    192.                 }         
    193.         };         
    194. }

    195. /************************************************************
    196. * 函数名称:void W25QXX_Erase_Chip(void)     
    197. * 函数功能:擦除整个芯片,等待时间较长
    198. * 入口参数:
    199. * 出口参数:
    200. * 函数说明:
    201. ************************************************************/
    202. void W25QXX_Erase_Chip(void)   
    203. {                                   
    204.     W25QXX_Write_Enable();                                  //SET WEL
    205.     W25QXX_Wait_Busy();   
    206.           SPI_ReadWriteByte (0x00); //BUG   
    207.         W25QXX_CS_Low;                                     //????   
    208.     SPI_ReadWriteByte(W25X_ChipErase);                //???????  
    209.         W25QXX_CS_High;                                    //????                  
    210.         W25QXX_Wait_Busy();                                                      //????????
    211. }

    212. /************************************************************
    213. * 函数名称:void W25QXX_Erase_Sector(uint32_t Dst_Addr)   
    214. * 函数功能:擦除一个扇区
    215. * 入口参数:Dst_Addr:扇区地址
    216. * 出口参数:
    217. * 函数说明:
    218. ************************************************************/
    219. void W25QXX_Erase_Sector(uint32_t Dst_Addr)   
    220. {  
    221.         //??falsh????,???   
    222.         //printf("fe:%x\r\n",Dst_Addr);         
    223.         Dst_Addr*=4096;
    224.     W25QXX_Write_Enable();                          //SET WEL         
    225.     W25QXX_Wait_Busy();   
    226.           SPI_ReadWriteByte (0x00); //BUG   
    227.         W25QXX_CS_Low;                                     //????   
    228.     SPI_ReadWriteByte(W25X_SectorErase);              //????????
    229.     SPI_ReadWriteByte((uint8_t)((Dst_Addr)>>16));          //??24bit??   
    230.     SPI_ReadWriteByte((uint8_t)((Dst_Addr)>>8));   
    231.     SPI_ReadWriteByte((uint8_t)Dst_Addr);  
    232.         W25QXX_CS_High;                                    //????                  
    233.     W25QXX_Wait_Busy();                                                      //??????
    234. }  

    235. /************************************************************
    236. * 函数名称:void W25QXX_Wait_Busy(void)      
    237. * 函数功能:等待空闲
    238. * 入口参数:
    239. * 出口参数:
    240. * 函数说明:
    241. ************************************************************/
    242. void W25QXX_Wait_Busy(void)   
    243. {   
    244.         while((W25QXX_ReadSR()&0x01)==0x01);                  // ??BUSY???
    245. }  

    246. /************************************************************
    247. * 函数名称:void W25QXX_PowerDown(void)      
    248. * 函数功能:进入掉电模式
    249. * 入口参数:
    250. * 出口参数:
    251. * 函数说明:
    252. ************************************************************/
    253. void W25QXX_PowerDown(void)   
    254. {
    255.           SPI_ReadWriteByte (0x00); //BUG   
    256.         W25QXX_CS_Low;                                            //????   
    257.     SPI_ReadWriteByte(W25X_PowerDown);        //??????  
    258.         W25QXX_CS_High;                                   //????                  
    259.     //delay_us(3);                               //??TPD  
    260.     __asm("NOP");
    261.     __asm("NOP");
    262.     __asm("NOP");
    263.     __asm("NOP");
    264.     __asm("NOP");
    265.     __asm("NOP");
    266.     __asm("NOP");
    267.     __asm("NOP");
    268. }   


    269. /************************************************************
    270. * 函数名称:void W25QXX_WAKEUP(void)      
    271. * 函数功能:唤醒
    272. * 入口参数:
    273. * 出口参数:
    274. * 函数说明:
    275. ************************************************************/
    276. void W25QXX_WAKEUP(void)   
    277. {  
    278.           SPI_ReadWriteByte (0x00); //BUG   
    279.         W25QXX_CS_Low;                                     //????   
    280.     SPI_ReadWriteByte(W25X_ReleasePowerDown);        //  send W25X_PowerDown command 0xAB   
    281.         W25QXX_CS_High;                                    //????                  
    282.     //delay_us(3);                                    //??TRES1
    283.     __asm("NOP");
    284.     __asm("NOP");
    285.     __asm("NOP");
    286.     __asm("NOP");
    287.     __asm("NOP");
    288.     __asm("NOP");
    289.     __asm("NOP");
    290.     __asm("NOP");
    291. }  
    复制代码
    1. #include "w25qxx.h"

    2. void W25QXX_Wait_Busy(void);
    3. //读取芯片ID
    4. //返回值如下:                                   
    5. //0XEF13,表示芯片型号为W25Q80  
    6. //0XEF14,表示芯片型号为W25Q16   
    7. //0XEF15,表示芯片型号为W25Q32  
    8. //0XEF16,表示芯片型号为W25Q64
    9. //0XEF17,表示芯片型号为W25Q128 <div class="blockcode"><blockquote>#include "spi.h"

    10. volatile bool isTransferCompleted = false;

    11. uint8_t TxData[64]={0x90,0x00,0x00,0x00};
    12. uint8_t RxData[64]={0xff};

    13. /************************************************************
    14. * 函数名称:SPI_Config()
    15. * 函数功能:配置DSPI2,SPI模式0,波特率500K
    16. * 入口参数:
    17. * 出口参数:
    18. * 函数说明:
    19. ************************************************************/
    20. void SPI_Config(void)
    21. {
    22.     dspi_master_config_t masterConfig;
    23.     gpio_pin_config_t cs_config = {kGPIO_DigitalOutput, 1,};
    24.     CLOCK_EnableClock ( kCLOCK_PortD);//开启PTD端口时钟
    25.     //PORT_SetPinMux(PORTD, 11U, kPORT_MuxAlt2);//CS
    26.     PORT_SetPinMux(PORTD, 12U, kPORT_MuxAlt2);
    27.     PORT_SetPinMux(PORTD, 13U, kPORT_MuxAlt2);
    28.     PORT_SetPinMux(PORTD, 14U, kPORT_MuxAlt2);
    29.     PORT_SetPinMux(PORTD, 11U, kPORT_MuxAsGpio);
    30.     GPIO_PinInit (GPIOD,11U,&cs_config);
    31.    
    32.     /* Master config */
    33.     masterConfig.whichCtar = kDSPI_Ctar0;
    34.     masterConfig.ctarConfig.baudRate = 500000U;
    35.     masterConfig.ctarConfig.bitsPerFrame = 8U;
    36.     masterConfig.ctarConfig.cpol = 1;//kDSPI_ClockPolarityActiveHigh
    37.     masterConfig.ctarConfig.cpha = kDSPI_ClockPhaseSecondEdge;
    38.     masterConfig.ctarConfig.direction = kDSPI_MsbFirst;
    39.     masterConfig.ctarConfig.pcsToSckDelayInNanoSec = 1000000000U / 500000U;
    40.     masterConfig.ctarConfig.lastSckToPcsDelayInNanoSec = 1000000000U / 500000U;
    41.     masterConfig.ctarConfig.betweenTransferDelayInNanoSec = 1000000000U / 500000U;

    42.     masterConfig.whichPcs = kDSPI_Pcs0;
    43.     masterConfig.pcsActiveHighOrLow = kDSPI_PcsActiveLow;

    44.     masterConfig.enableContinuousSCK = false;
    45.     masterConfig.enableRxFifoOverWrite = false;
    46.     masterConfig.enableModifiedTimingFormat = false;
    47.     masterConfig.samplePoint = kDSPI_SckToSin0Clock;

    48.     DSPI_MasterInit(SPI2, &masterConfig, CLOCK_GetFreq(DSPI2_CLK_SRC));
    49. }


    50. /************************************************************
    51. * 函数名称:SPI_Transfer(uint8_t *txData,uint8_t *rxData,uint8_t size)
    52. * 函数功能:SPI传送数据
    53. * 入口参数:uint8_t txData/rxData数据发送接收缓冲区-uint8_t size数据大小
    54. * 出口参数:
    55. * 函数说明:
    56. ************************************************************/
    57. void SPI_Transfer(uint8_t *txData,uint8_t *rxData,uint8_t size)
    58. {
    59.     dspi_transfer_t masterXfer;
    60.     isTransferCompleted = false;
    61.     isTransferCompleted = false;
    62.     masterXfer.txData = txData;
    63.     masterXfer.rxData = rxData;
    64.     masterXfer.dataSize = size;
    65.     masterXfer.configFlags =  kDSPI_MasterPcsContinuous;//kDSPI_MasterCtar0 | kDSPI_MasterPcs0 |
    66.     DSPI_MasterTransferBlocking(SPI2, &masterXfer);
    67. }


    68. uint8_t SPI_ReadWriteByte(uint8_t inData)
    69. {
    70.     uint8_t a = inData,b=0x00;
    71.     SPI_Transfer(&a,&b,1);
    72.     return b;
    73.    
    74. }



    复制代码


    1. #ifndef __SPI_H
    2. #define __SPI_H


    3. //SPI Driver
    4. #include "fsl_spi.h"
    5. //#include "fsl_debug_console.h"
    6. #include "fsl_gpio.h"
    7. #include "fsl_common.h"
    8. #include "fsl_port.h"


    9. #define SPI_Port_Clock kCLOCK_PortD
    10. #define SPI0_MISO_Pin    (3U)
    11. #define SPI0_MOSI_Pin    (2U)
    12. #define SPI0_SCLK_Pin    (1U)
    13. #define SPI0_CS_Pin      (0U)//as GPIO
    14. #define SIP0_CS_GPIO   GPIOD
    15. #define SPI0_Port      PORTD

    16. void SPI_Config(void);
    17. uint8_t SPI_ReadWriteByte(uint8_t inData);

    18. #define SPI0_CS_High   GPIO_WritePinOutput(GPIOD,0U,1)
    19. #define SPI0_CS_Low    GPIO_WritePinOutput(GPIOD,0U,0);

    20. #endif
    复制代码
    1. #include "spi.h"

    2. static volatile bool masterFinished = false;
    3. static spi_master_handle_t masterHandle;

    4. static void masterCallback(SPI_Type *base, spi_master_handle_t *handle, status_t status, void *userData)
    5. {
    6.     masterFinished = true;
    7. }


    8. void SPI_Config(void)
    9. {
    10.     uint32_t sourceClock=0;
    11.     spi_master_config_t masterConfig = {0};
    12.     gpio_pin_config_t cs_config = {kGPIO_DigitalOutput, 1,};
    13.     CLOCK_EnableClock ( SPI_Port_Clock);//开启PTD端口时钟
    14.    
    15.     PORT_SetPinMux(SPI0_Port, SPI0_SCLK_Pin, kPORT_MuxAlt2);
    16.     PORT_SetPinMux(SPI0_Port, SPI0_MISO_Pin, kPORT_MuxAlt5);
    17.     PORT_SetPinMux(SPI0_Port, SPI0_MOSI_Pin, kPORT_MuxAlt5);
    18.     PORT_SetPinMux(SPI0_Port, SPI0_CS_Pin, kPORT_MuxAsGpio);
    19.     GPIO_PinInit (SIP0_CS_GPIO,SPI0_CS_Pin,&cs_config);
    20.     SPI_MasterGetDefaultConfig(&masterConfig);
    21.    
    22.      masterConfig.enableStopInWaitMode = false;
    23.      masterConfig.polarity = 1;//1
    24.      masterConfig.phase = kSPI_ClockPhaseSecondEdge;//时钟相位
    25.      masterConfig.direction = kSPI_MsbFirst;
    26.      masterConfig.dataMode = kSPI_8BitMode;
    27.      //masterConfig.txWatermark = kSPI_TxFifoOneHalfEmpty;
    28.      //masterConfig.rxWatermark = kSPI_RxFifoOneHalfFull;
    29.      masterConfig.pinMode = kSPI_PinModeOutput;//引脚模式kSPI_PinModeInput
    30.      masterConfig.outputMode = kSPI_SlaveSelectAsGpio;
    31.      masterConfig.baudRate_Bps = 500000U;
    32.     // SPI_MasterGetDefaultConfig(&masterConfig);
    33.      sourceClock = CLOCK_GetFreq(kCLOCK_BusClk);
    34.      SPI_MasterInit(SPI0, &masterConfig, sourceClock);
    35.      //SPI_MasterTransferCreateHandle(SPI0, &masterHandle, masterCallback, NULL);
    36. }

    37. void SPI_Transfer(uint8_t *txData,uint8_t *rxData,uint8_t size)
    38. {
    39.     spi_transfer_t masterXfer;
    40.     masterXfer.txData = txData;
    41.     masterXfer.rxData = rxData;
    42.     masterXfer.dataSize = size;
    43.     SPI_MasterTransferBlocking(SPI0, &masterXfer);
    44. //    while (masterFinished != true)
    45. //    {
    46. //    }
    47. }

    48. uint8_t SPI_ReadWriteByte(uint8_t inData)
    49. {
    50.     uint8_t a = inData,b=0x00;
    51.     SPI_Transfer(&a,&b,1);
    52.     return b;
    53.    
    54. }
    复制代码
    1. #ifndef __SPI_H
    2. #define __SPI_H

    3. /////DSPI驱动
    4. #include "fsl_gpio.h"
    5. #include "fsl_common.h"
    6. #include "fsl_port.h"
    7. #include "fsl_dspi.h"

    8. #define TRANSFER_BAUDRATE 500000U


    9. //W25X??/Q??????           
    10. //W25Q80  ID  0XEF13
    11. //W25Q16  ID  0XEF14
    12. //W25Q32  ID  0XEF15
    13. //W25Q64  ID  0XEF16        
    14. //W25Q128 ID  0XEF17        
    15. //#define W25Q80         0XEF13         
    16. //#define W25Q16         0XEF14
    17. //#define W25Q32         0XEF15
    18. //#define W25Q64         0XEF16
    19. //#define W25Q128        0XEF17

    20.                                         //??W25QXX????                  


    21.                                  
    22. ////////////////////////////////////////////////////////////////////////////
    23. //#define W25QXX_CS_High   GPIO_WritePinOutput(GPIOD,11U,1)
    24. //#define W25QXX_CS_Low    GPIO_WritePinOutput(GPIOD,11U,0);


    25. /************************************************************
    26. * 函数名称:SPI_Config()
    27. * 函数功能:配置SPI2
    28. * 入口参数:
    29. * 出口参数:
    30. * 函数说明:
    31. ************************************************************/
    32. void SPI_Config(void);
    33. //void SPI_Test();
    34. void SPI_Transfer(uint8_t *txData,uint8_t *rxData,uint8_t size);

    35. uint8_t SPI_ReadWriteByte(uint8_t inData);

    36. #endif
    复制代码

    回复

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24987
    最后登录
    2025-7-30
    发表于 2016-6-27 14:45:00 | 显示全部楼层
    感谢楼主的源代码分享!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    5

    主题

    18

    帖子

    1

    注册会员

    Rank: 2

    积分
    104
    最后登录
    2021-7-26
    发表于 2018-7-16 17:02:03 | 显示全部楼层
    请问怎么用呢?开发板上都没有spiflash的fatfs文件系统的例程
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-30 22:21 , Processed in 0.081210 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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