久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 945|回復: 4
收起左側

單片機軟件SPI的問題

[復制鏈接]
ID:90212 發表于 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:規定了SCK時鐘信號空閑狀態的電平(0-低電平,1-高電平)
  4. //CPHA:規定了數據是在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 讀寫一個字節
  115. //TxData:要寫入的字節
  116. //返回值:讀取到的字節
  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. }
復制代碼






回復

使用道具 舉報

ID:57657 發表于 2024-7-28 08:36 | 顯示全部樓層
SPI信號有問題的可以用邏輯分析儀檢測,寄存器中斷配置方法具體見數據手冊。
回復

使用道具 舉報

ID:639106 發表于 2024-7-28 08:42 | 顯示全部樓層
e,把SPI從器件和電路圖貼出來看看吧
回復

使用道具 舉報

ID:639106 發表于 2024-7-28 08:43 | 顯示全部樓層
可以先用邏輯分析儀抓下SCLK和MISO的信號
回復

使用道具 舉報

ID:639106 發表于 2024-7-28 09:00 | 顯示全部樓層
還有,要先設置IO口工作模式 2.jpg


  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;
復制代碼




回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩成人在线网站 | 国产免费拔擦拔擦8x高清 | 69电影网| 一区二区三区av | 国产一级免费视频 | 观看av| 精品中文字幕一区二区三区 | 精品国产乱码久久久久久a丨 | 日韩综合在线 | 麻豆国产一区二区三区四区 | 欧美中文字幕一区二区三区 | 欧美综合一区二区三区 | 久久噜噜噜精品国产亚洲综合 | 人妖一区| 国产精品高潮呻吟久久久久 | 97免费视频在线观看 | 日韩在线视频免费观看 | 亚洲欧美一区二区三区国产精品 | 亚洲精品1区2区3区 91免费看片 | 日韩一区二区在线观看 | 国产精品视频一区二区三 | 成人自拍av | 中文字幕第一页在线 | 久久精品青青大伊人av | 国产精品美女久久久久久免费 | 久久久.com| 国产欧美一区二区三区在线看 | 精品日本中文字幕 | 日日干天天操 | 中文字幕在线免费观看 | 国产超碰人人爽人人做人人爱 | 国产精品日韩欧美一区二区三区 | 9久久婷婷国产综合精品性色 | 中文日韩在线视频 | 色吊丝2| 成人美女免费网站视频 | 男人的天堂在线视频 | 亚洲精品在线观看网站 | 成人福利在线 | 欧美一区二区大片 | 四虎永久免费在线 |