找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 1008|回復: 4
打印 上一主題 下一主題
收起左側

單片機軟件SPI的問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:90212 發(fā)表于 2024-7-27 21:02 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
SPI也就4種模式,csdn扒了個SPI的驅動,改了下在STC15單片機下不能正常使用,讀取全是0xFF。目前用到的案例是CPOL不限,CPHA =1。也就是1/3模式,

以下是代碼:
spi.h:
  1. #ifndef __SPI_H
  2. #define __SPI_H

  3. #define FOSC        22118400UL
  4. #define BAUD        115200

  5. #include "STC15W4K.H"      
  6. #include<intrins.h>
  7. typedef unsigned char u8;
  8. typedef unsigned int u16;

  9. #define CS_L                                                         P16=0
  10. #define CS_H                                                         P16=1
  11. #define SCK_L                                                  P15=0
  12. #define SCK_H                                                  P15=1
  13. #define MOSI_L                                                P13=0
  14. #define MOSI_H                                                P13=1
  15. #define MISO              P44

  16. u8 SOFT_SPI_RW_MODE(u8 write_dat);

  17. u8 SPI2_ReadWriteByte(u8 TxData);

  18. #endif
復制代碼

spi.c:
  1. #include "spi.h"
  2. #define  SPI_Mode 3  //選擇SPI的模式

  3. //CPOL:規(guī)定了SCK時鐘信號空閑狀態(tài)的電平(0-低電平,1-高電平)
  4. //CPHA:規(guī)定了數據是在SCK時鐘的上升沿還是下降沿被采樣(0-第一個時鐘邊沿開始采樣,1-第二個時鐘邊沿開始采樣)
  5. //模式0:CPOL=0,CPHA =0  SCK空閑為低電平,數據在SCK的上升沿被采樣(提取數據)
  6. //模式1:CPOL=0,CPHA =1  SCK空閑為低電平,數據在SCK的下降沿被采樣(提取數據)
  7. //模式2:CPOL=1,CPHA =0  SCK空閑為高電平,數據在SCK的下降沿被采樣(提取數據)
  8. //模式3:CPOL=1,CPHA =1  SCK空閑為高電平,數據在SCK的上升沿被采樣(提取數據)


  9. /*spi延時函數,微秒*/
  10. static void spi_delay(u16 time)
  11. {
  12.     u8 i = 0;
  13.     while(time--)
  14.     {
  15.         i = 10;
  16.         while(i--) ;
  17.     }
  18. }

  19. #if SPI_Mode==0
  20. /* CPOL = 0, CPHA = 0 */
  21. u8 SOFT_SPI_RW_MODE(u8 write_dat)
  22. {
  23.     u8 i, read_dat = 0;
  24.     SCK_L;
  25.     for(i = 0; i < 8; i++)
  26.     {
  27.         if(write_dat & 0x80)
  28.             MOSI_H;
  29.         else
  30.             MOSI_L;
  31.         write_dat <<= 1;
  32.         spi_delay(1);
  33.         SCK_H;
  34.         read_dat <<= 1;

  35.         if(MISO)
  36.             read_dat++;
  37.         spi_delay(1);
  38.         SCK_L;
  39.         _nop_();
  40.     }
  41.     return read_dat;
  42. }
  43. #elif SPI_Mode==1
  44. /* CPOL=0,CPHA=1 */
  45. u8 SOFT_SPI_RW_MODE(u8 write_dat)
  46. {
  47.     u8 i, read_dat = 0;
  48.     SCK_L;
  49.     for(i = 0; i < 8; i++)
  50.     {
  51.         SCK_H;
  52.         if(write_dat & 0x80)
  53.             MOSI_H;
  54.         else
  55.             MOSI_L;
  56.         write_dat <<= 1;
  57.         spi_delay(1);
  58.         SCK_L;
  59.         read_dat <<= 1;

  60.         if(MISO)
  61.             read_dat++;
  62.         spi_delay(1);
  63.     }
  64.     return read_dat;
  65. }
  66. #elif SPI_Mode==2
  67. /* CPOL=1,CPHA=0 */
  68. u8 SOFT_SPI_RW_MODE(u8 write_dat)
  69. {
  70.     u8 i, read_dat = 0;
  71.     SCK_H;
  72.     for(i = 0; i < 8; i++)
  73.     {
  74.         if(write_dat & 0x80)
  75.             MOSI_H;
  76.         else
  77.             MOSI_L;
  78.         write_dat <<= 1;
  79.         spi_delay(1);
  80.         SCK_L;
  81.         read_dat <<= 1;

  82.         if(MISO)
  83.             read_dat++;
  84.         spi_delay(1);
  85.         SCK_H;
  86.     }
  87.     return read_dat;
  88. }
  89. #elif SPI_Mode==3
  90. /* CPOL = 1, CPHA = 1 */
  91. u8 SOFT_SPI_RW_MODE(u8 write_dat)
  92. {
  93.     u8 i, read_dat = 0;
  94.     SCK_H;
  95.     for(i = 0; i < 8; i++)
  96.     {
  97.         SCK_L;
  98.         if(write_dat & 0x80)
  99.             MOSI_H;
  100.         else
  101.             MOSI_L;
  102.         write_dat <<= 1;
  103.         spi_delay(1);
  104.         SCK_H;
  105.         read_dat <<= 1;

  106.         if(MISO)
  107.             read_dat++;
  108.         spi_delay(1);
  109.         _nop_();
  110.     }
  111.     return read_dat;
  112. }
  113. #endif        

  114. //SPI2 讀寫一個字節(jié)
  115. //TxData:要寫入的字節(jié)
  116. //返回值:讀取到的字節(jié)
  117. u8 SPI2_ReadWriteByte(u8 TxData)
  118. {
  119.     u8 Rxdata;
  120.           CS_L;
  121.     Rxdata = SOFT_SPI_RW_MODE(TxData);
  122.           CS_H;
  123.     return Rxdata;
  124. }
復制代碼






分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:57657 發(fā)表于 2024-7-28 08:36 | 只看該作者
SPI信號有問題的可以用邏輯分析儀檢測,寄存器中斷配置方法具體見數據手冊。
回復

使用道具 舉報

板凳
ID:639106 發(fā)表于 2024-7-28 08:42 | 只看該作者
e,把SPI從器件和電路圖貼出來看看吧
回復

使用道具 舉報

地板
ID:639106 發(fā)表于 2024-7-28 08:43 | 只看該作者
可以先用邏輯分析儀抓下SCLK和MISO的信號
回復

使用道具 舉報

5#
ID:639106 發(fā)表于 2024-7-28 09:00 | 只看該作者
還有,要先設置IO口工作模式


  1. #define CS_L                                                         P16=0
  2. #define CS_H                                                         P16=1
  3. #define SCK_L                                                  P15=0
  4. #define SCK_H                                                  P15=1
  5. #define MOSI_L                                                P13=0
  6. #define MOSI_H                                                P13=1
  7. #define MISO              P44
復制代碼
有沒有可能CS沒被拉低
加上這個試試
  1.   P0M0=0x00;
  2.   P1M0=0x00;
  3.   P2M0=0x00;
  4.   P3M0=0x00;
  5.   P4M0=0x00;
  6.   P0M1=0x00;
  7.   P1M1=0x00;
  8.   P2M1=0x00;
  9.   P3M1=0x00;
  10.   P4M1=0x00;
復制代碼




回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

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