欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 23|回復: 0
打印 上一主題 下一主題
收起左側

C51單片機使用硬件SPI通訊W25Q16 flash芯片,MISO無信號

[復制鏈接]
跳轉到指定樓層
樓主
ID:1154150 發表于 2025-6-17 17:10 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
如圖,SPI通訊主機正常發送信號,但從機一直保持低電平。初始化的時候我把SPI的口都設置為推挽輸出高電平狀態,空閑時MISO也應該是高,但不知道什么原因拉低了。求助,幫忙分析一下代碼。多謝!!
  1. #include "H/Function_Init.H"

  2. #define SPI_CS   P07  // 自定義片選引腳

  3. // W25Q16指令集
  4. #define W25Q16_Write_Status   0x01         //W25Q16寫狀態寄存器指令
  5. #define W25Q16_Read_Status    0x05         //W25Q16讀狀態寄存器指令
  6. #define W25Q16_Write_Enable   0x06         //寫使能指令
  7. #define W25Q16_Page_Program   0x02         //頁編程指令

  8. #define W25Q16_Read_Data      0x03         //讀使能指令
  9. #define W25Q16_SectorErase    0x20         //快B刪除指令
  10. #define W25Q16_Chip_Erase     0xc7         //擦除W25Q16芯片

  11. #define W25Q16_Device_ID                        0x90       //讀芯片ID

  12. uint8_t SPI0_Master_SendData[3][8] = {
  13.         {0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8},
  14.         {0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18},
  15.         {0xAA,0xBB,0xCC,0xDD,0xEE,0xFF,0x00,0x00}
  16.     };
  17. volatile uint8_t SPI0_Slaver_ReceiveData[8];
  18. uint8_t TxXferCount = 0;  //SPI/TWI發送數據數目
  19. uint8_t RxXferCount = 0;  //SPI/TWI接受數據數目
  20. bit SPI0Flag = 0;

  21. void Delay(unsigned long int delaycnt)
  22. {
  23.    while(delaycnt--);
  24. }
  25. /*****************************************************
  26. *函數名稱:void SPI0_Init(void)
  27. *函數功能:SPI0初始化
  28. *入口參數:void
  29. *出口參數:void
  30. *****************************************************/
  31. void SPI0_Init(void)
  32. {
  33.   OTCON |= 0X10;        //設置SPI0工作模式
  34.   US0CON0 = 0x23;       //-設置SPI0為主設備,SCK空閑時間為低電平,SCK周期第一沿采集數據,時鐘速率為Fsy/8,模式0
  35.   US0CON1 = 0x00;       //MSB優先發送,8位傳輸,bit0:TXE=0不允許發送中斷,TXE=1允許中斷
  36.   US0CON0 |= 0x80;      //開啟SPI0
  37.   IE1 |= 0x01;
  38.   EA = 1;
  39. }
  40. /*****************************************************
  41. *函數名稱:void TWI0/PI/UART1_Int() interrupt 7
  42. *函數功能:USCI0中斷函數
  43. *入口參數:void
  44. *出口參數:void
  45. *****************************************************/
  46. void SPI0_Int(void) interrupt 7    //SPI0中斷函數
  47. {
  48.   if(US0CON1 & 0X08)  //發送緩存器空標志判斷
  49.   {
  50.     US0CON1 &= ~0X08;
  51.   }
  52.   if(US0CON1 & 0X80)  //數據傳輸完成標志位判斷
  53.   {
  54.     US0CON1 &= ~0X80;
  55.     SPI0Flag = 1;
  56.   }
  57. }
  58. //SPI口讀寫數據
  59. unsigned char SPI0_WriteReadByte(unsigned char TxData)
  60. {
  61.          unsigned char RxData = 0;
  62.    US0CON2 = TxData;
  63. //         while(SPI0Flag == 0);               //等待發送完成        
  64.          while(!(SPI0Flag == 1));
  65.          SPI0Flag = 0;
  66.          RxData = US0CON2;               
  67.          return RxData ;
  68. //         return US0CON2;
  69. }
  70. //讀取W25QXX的狀態寄存器
  71. unsigned char W25Q16_ReadStatus(void)   
  72. {  
  73.         unsigned char W25Q16_statusbyte=0;   
  74.         SPI_CS=0;                                   //使能器件   
  75.         SPI0_WriteReadByte(W25Q16_Read_Status);    //發送讀取狀態寄存器命令   
  76.         W25Q16_statusbyte=SPI0_WriteReadByte(0xff);               //讀取一個字節  
  77.         SPI_CS=1;                                 //取消片選     
  78.         return W25Q16_statusbyte;   
  79. }
  80. //等待空閑
  81. void W25Q16_Wait_Busy(void)   
  82. {   SPI_CS = 0;
  83.         while(W25Q16_ReadStatus()&0x01);   // 等待BUSY位清空
  84.         SPI_CS = 1;
  85. }
  86. // W25Q16寫使能,將WEL置位  
  87. //W25QXX_WriteEnable  0x06
  88. void W25Q16_WriteEnable(void)        
  89. {
  90.     SPI_CS = 0;
  91.     SPI0_WriteReadByte(W25Q16_Write_Enable);
  92.     SPI_CS = 1;
  93. }
  94. //芯片擦除
  95. void W25Q16_Erase_Chip(void)   
  96. {     
  97. //    W25Q16_Wait_Busy();           
  98.     W25Q16_WriteEnable();                        //SET WEL
  99.           SPI_CS=0;                                    //使能器件   
  100.     SPI0_WriteReadByte(W25Q16_Chip_Erase);       //發送片擦除命令  
  101.                 SPI_CS=1;                                    //取消片選                  
  102.                 W25Q16_Wait_Busy();                                                  //等待芯片擦除結束
  103. }   
  104. // 頁寫入數據
  105. void W25Q16_WriteData(unsigned long addr, unsigned char *buf, unsigned int len)
  106. {
  107.           unsigned int i = 0;
  108. //          while(W25Q16_ReadStatus()&0x01);       // 判斷是否忙
  109.           W25Q16_Wait_Busy();                        
  110.     W25Q16_WriteEnable();                  // 發送寫使能
  111.     SPI_CS = 0;
  112.     SPI0_WriteReadByte(W25Q16_Page_Program);     // 發送頁編程指令
  113.     SPI0_WriteReadByte((addr >> 16) );          // 地址高位
  114.     SPI0_WriteReadByte((addr >> 8) );
  115.     SPI0_WriteReadByte(addr);
  116.     // 寫入數據
  117.     for (i = 0; i < len; i++)
  118.    {
  119.         SPI0_WriteReadByte(buf[i]);
  120.     }
  121.           SPI_CS = 1;  
  122. //    while (W25Q16_ReadStatus() & 0x01);              // 等待寫入完成
  123.           W25Q16_Wait_Busy();                                           //等待寫入結束               
  124. }
  125. // 從W25Q16讀取數據
  126. void W25Q16_ReadData(unsigned long addr, unsigned char *buf, unsigned int len)
  127. {
  128.         unsigned int i = 0;
  129.     SPI_CS = 0;
  130.     SPI0_WriteReadByte(W25Q16_Read_Data);
  131.     SPI0_WriteReadByte((addr >> 16) ); // 地址高位
  132.     SPI0_WriteReadByte((addr >> 8) );
  133.     SPI0_WriteReadByte(addr );   
  134.     // 讀取數據
  135.     for (i = 0; i < len; i++)
  136.          {
  137.         buf[i] = SPI0_WriteReadByte(0xFF);
  138.     }
  139.     SPI_CS = 1;
  140. }
  141. //讀取芯片ID                  
  142. //0XEF14,表示芯片型號為W25Q16         
  143. unsigned long  W25Q16_ReadID(void)
  144. {
  145.     unsigned long  Temp = 0;      
  146.     SPI_CS=0;                    
  147.     SPI0_WriteReadByte(0x90);//發送讀取ID命令        
  148.     SPI0_WriteReadByte(0x00);         
  149.     SPI0_WriteReadByte(0x00);         
  150.     SPI0_WriteReadByte(0x00);                     
  151.     Temp|=SPI0_WriteReadByte(0xFF)<<8;  
  152.     Temp|=SPI0_WriteReadByte(0xFF);     
  153.     SPI_CS=1;                    
  154.     return Temp;
  155. }

  156. /*****************************************************
  157. *函數名稱:void main(void)
  158. *函數功能:USCI0測試
  159. *入口參數:void
  160. *出口參數:void
  161. *****************************************************/
  162. void main(void)
  163. {
  164.           unsigned char j=0,i=0;
  165.           unsigned char readBuf[8];
  166.           unsigned long W25Q16_addr = 0x000000; // 起始地址
  167.                 P0CON = 0xf2;           //P07口推挽輸出,
  168.           P0 = 0xf0;              //P07初始高電平
  169.     SPI0_Init();        
  170.         
  171.           W25Q16_Erase_Chip();
  172.         while(1)
  173.   {
  174. //                W25Q16_ReadStatus();//讀狀態位
  175.                   // 讀取Flash ID
  176.     W25Q16_ReadID();        
  177.                                                 
  178.                 for(j=0;j<3;j++)
  179.                 {
  180.                      SPI_CS = 0;        
  181.                    W25Q16_WriteData(W25Q16_addr, SPI0_Master_SendData[j], 8);  // 直接寫入一行
  182.                          W25Q16_ReadData(W25Q16_addr, &readBuf[j], 8);       // 讀取到獨立緩沖區
  183.                     SPI_CS = 1;
  184.                          W25Q16_addr += 0x000100;  // 遞增地址
  185.                 }                                
  186.                 Delay(5000);
  187.                 P01 = ~P01;
  188.   }
  189. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表