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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC15與MAX31856的SPI讀取全是0xFF

[復制鏈接]
跳轉到指定樓層
樓主
淘的一個max31856現成的模塊,附送了Arduino范例和一個FreeRTOS的范例,恰恰對這兩個很陌生,便根據max31856文檔改成了STC15的第二組spi接口((P2.4///SPISS, P2.3/MOSI_2, P2.2/MISO_2, P2.1/SCLK_2))。
無論用stcisp中stc15的spi單主單從范例,還是虛擬spi,讀出的寄存器值都是0xFF(255)。
可以確定接線沒問題,如果接線錯誤讀出的就是0x00.
原理圖:


代碼如下:
  1. //本示例在Keil開發環境下請選擇Intel的8058芯片型號進行編譯
  2. //若無特別說明,工作頻率一般為11.0592MHz
  3. #include "reg51.h"
  4. #include<stdio.h>
  5. #include<intrins.h>

  6. #define FOSC        11059200UL
  7. #define BAUD        115200

  8. typedef unsigned char BYTE;
  9. typedef unsigned int WORD;
  10. typedef unsigned char u8;
  11. typedef unsigned int u16;

  12. #define SR_Read 0x0F
  13. #define     URMD    0           //0:使用定時器2作為波特率發生器
  14. //1:使用定時器1的模式0(16位自動重載模式)作為波特率發生器
  15. //2:使用定時器1的模式2(8位自動重載模式)作為波特率發生器
  16. sfr P1M1 = 0x91;    //PxM1.n,PxM0.n     =00--->Standard,    01--->push-pull
  17. sfr P1M0 = 0x92;    //                  =10--->pure input,  11--->open drain
  18. sfr P0M1 = 0x93;
  19. sfr P0M0 = 0x94;
  20. sfr P2M1 = 0x95;
  21. sfr P2M0 = 0x96;
  22. sfr P3M1 = 0xB1;
  23. sfr P3M0 = 0xB2;
  24. sfr P4M1 = 0xB3;
  25. sfr P4M0 = 0xB4;
  26. sfr P5M1 = 0xC9;
  27. sfr P5M0 = 0xCA;
  28. sfr P6M1 = 0xCB;
  29. sfr P6M0 = 0xCC;
  30. sfr P7M1 = 0xE1;
  31. sfr P7M0 = 0xE2;
  32. sfr T2H   = 0xd6;               //定時器2高8位
  33. sfr T2L   = 0xd7;               //定時器2低8位

  34. sfr  AUXR           =   0x8e;                   //輔助寄存器
  35. sfr P_SW1           =   0xa2;                   //外設功能切換寄存器1
  36. #define SPI_S0 0x04             //P_SW1.2
  37. #define SPI_S1 0x08             //P_SW1.3

  38. sfr SPSTAT      =   0xcd;       //SPI狀態寄存器
  39. #define SPIF        0x80        //SPSTAT.7                                
  40. #define WCOL        0x40        //SPSTAT.6                                
  41. sfr SPCTL       =   0xce;       //SPI控制寄存器
  42. #define SSIG        0x80        //SPCTL.7                                 
  43. #define SPEN        0x40        //SPCTL.6                                 
  44. #define DORD        0x20        //SPCTL.5                                 
  45. #define MSTR        0x10        //SPCTL.4                                 
  46. #define CPOL        0x08        //SPCTL.3                                 
  47. #define CPHA        0x04        //SPCTL.2                                 
  48. #define SPDHH       0x00        //CPU_CLK/4                              
  49. #define SPDH        0x01        //CPU_CLK/16                              
  50. #define SPDL        0x02        //CPU_CLK/64                              
  51. #define SPDLL       0x03        //CPU_CLK/128                             
  52. sfr SPDAT       =   0xcf;       //SPI數據寄存器
  53. sbit SPISS      =   P2 ^ 4;     //SPI從機選擇口, 連接到其它MCU的SS口
  54. //當SPI為一主多從模式時,請使用主機的普通IO口連接到從機的SS口

  55. sfr IE2         =   0xAF;       //中斷控制寄存器2
  56. #define ESPI        0x02        //IE2.1
  57. void InitUart();
  58. void InitSPI();

  59. u16 WenDu;
  60. u8 WenDu_Time, Error;
  61. BYTE SPISwap(BYTE dat);
  62. u8 SPI_RW_Reg(u8 reg, u8 value);
  63. ///////////////////////////////////////////////////////////
  64. void Delay500ms(void)        //@11.0592MHz
  65. {
  66.     unsigned char data i, j, k;
  67.     _nop_();
  68.     _nop_();
  69.     i = 22;
  70.     j = 3;
  71.     k = 227;
  72.     do
  73.     {
  74.         do
  75.         {
  76.             while (--k);
  77.         }
  78.         while (--j);
  79.     }
  80.     while (--i);
  81. }

  82. void main()
  83. {
  84.     u16 x, y;
  85.     P0M0 = 0x00;
  86.     P0M1 = 0x00;
  87.     P1M0 = 0x00;
  88.     P1M1 = 0x00;
  89.     P2M0 = 0x00;
  90.     P2M1 = 0x00;
  91.     P3M0 = 0x00;
  92.     P3M1 = 0x00;
  93.     P4M0 = 0x00;
  94.     P4M1 = 0x00;
  95.     P5M0 = 0x00;
  96.     P5M1 = 0x00;
  97.     P6M0 = 0x00;
  98.     P6M1 = 0x00;
  99.     P7M0 = 0x00;
  100.     P7M1 = 0x00;

  101.     InitUart();                 //初始化串口
  102.     InitSPI();                  //初始化SPI
  103.     IE2 |= ESPI;
  104.     EA = 1;
  105.     while (1)
  106.     {
  107.         Delay500ms()        ;
  108.         x = SPISwap(0x00);//00~0F 都是只讀配置reg
  109.         y = SPISwap(0x01);
  110.         printf("MAX31856_Read00:%d ;Read01:%d\n", x, y);
  111.     }
  112. }

  113. BYTE SPISwap(BYTE dat)
  114. {
  115.     SPDAT = dat;                //觸發SPI發送數據
  116.     while (!(SPSTAT & SPIF));   //等待發送完成
  117.     SPSTAT = SPIF | WCOL;       //清除SPI狀態位
  118.     return SPDAT;               //返回SPI數據
  119. }
  120. //SPI寫寄存器
  121. //reg:指定寄存器地址
  122. //value:寫入的值
  123. u8 SPI_RW_Reg(u8 reg, u8 value)
  124. {
  125.     u8 status;
  126.     status = SPISwap(reg); //返回從MISO讀出的數據,status應為上次向該寄存器內寫的value
  127.     SPISwap(value);        //寫入寄存器的值
  128.     return status;       // 返回狀態值
  129. }
  130. ///////////////////////////////////////////////////////////
  131. void InitUart()
  132. {
  133.     SCON = 0x5a;                //設置串口為8位可變波特率
  134. #if URMD == 0
  135.     T2L = (65536 - (FOSC / 4 / BAUD));
  136.     T2H = (65536 - (FOSC / 4 / BAUD)) >> 8;
  137.     AUXR = 0x14;                //T2為1T模式, 并啟動定時器2
  138.     AUXR |= 0x01;               //選擇定時器2為串口1的波特率發生器
  139. #elif URMD == 1
  140.     AUXR = 0x40;                //定時器1為1T模式
  141.     TMOD = 0x00;                //定時器1為模式0(16位自動重載)
  142.     TL1 = (65536 - (FOSC / 4 / BAUD));
  143.     TH1 = (65536 - (FOSC / 4 / BAUD)) >> 8;
  144.     TR1 = 1;                    //定時器1開始啟動
  145. #else
  146.     TMOD = 0x20;                //設置定時器1為8位自動重裝載模式
  147.     AUXR = 0x40;                //定時器1為1T模式
  148.     TH1 = TL1 = (256 - (FOSC / 32 / BAUD));
  149.     TR1 = 1;
  150. #endif
  151. }
  152. ///////////////////////////////////////////////////////////
  153. void InitSPI()
  154. {
  155.     ACC = P_SW1;                                //可用于測試U7,U7使用的是第二組SPI控制Flash
  156.     ACC &= ~(SPI_S0 | SPI_S1);                  //SPI_S0=1 SPI_S1=0
  157.     ACC |= SPI_S0;                              //(<b>P2.4///SPISS, P2.3/MOSI_2, P2.2/MISO_2, P2.1/SCLK_2</b>)
  158.     P_SW1 = ACC;

  159.     SPDAT = 0;                  //初始化SPI數據
  160.     SPSTAT = SPIF | WCOL;                       //清除SPI狀態
  161.     SPCTL =  SPEN | MSTR;                 //設置SPI為主模式
  162.     //SPCTL = SPEN | MSTR | SSIG | SPDLL;        //主機模式 忽略SS引腳
  163. }
復制代碼
有沒遇到同類問題的高手請指點一下。

原資料包: MAX31856模塊資料.zip (1.47 MB, 下載次數: 6)

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

使用道具 舉報

沙發
ID:161164 發表于 2024-7-22 09:25 | 只看該作者


你沒有置位SSIG
而且SS腳需要在讀寫前手動拉低


回復

使用道具 舉報

板凳
ID:90212 發表于 2024-7-22 21:05 | 只看該作者
lkc8210 發表于 2024-7-22 09:25
你沒有置位SSIG
而且SS腳需要在讀寫前手動拉低

按你所說,初始化忽略SS引腳,并把CS腳拉低(就一主一從),萬用表測試也確實保持著0V,測試還是老樣子。
  1. void InitSPI()
  2. {
  3.     ACC = P_SW1;                                //可用于測試U7,U7使用的是第二組SPI控制Flash
  4.     ACC &= ~(SPI_S0 | SPI_S1);                  //SPI_S0=1 SPI_S1=0
  5.     ACC |= SPI_S0;                              //(P2.4///SPISS, P2.3/MOSI_2, P2.2/MISO_2, P2.1/SCLK_2)
  6.     P_SW1 = ACC;  

  7.     SPDAT = 0;                  //初始化SPI數據  
  8.           SPSTAT = SPIF | WCOL;                       //清除SPI狀態
  9.     SPISS = 0;//片選恒定拉低
  10.     SPCTL =  SPEN | MSTR| SSIG ;                 //設置SPI為主模式 忽略SS引腳

  11. }
復制代碼



回復

使用道具 舉報

地板
ID:430492 發表于 2024-7-23 08:52 | 只看該作者
如果不是硬件的SPI,那大概率是時序的問題。
回復

使用道具 舉報

5#
ID:90212 發表于 2024-7-23 22:09 | 只看該作者
懷疑max31856板子故障,特意用Arduino mega2560搭了下,直接用現成的范例,軟件spi,測試是正常的:



沒接熱電偶,直接短接可以讀出冷端和0mv對應的溫度:



回復

使用道具 舉報

6#
ID:90212 發表于 2024-7-31 20:03 | 只看該作者
總算熬了幾個夜搞清楚了,max31856規格書沒認真看,以為跟以往一樣下個范例改吧改吧就可以用了,其實好多案例都是害人的。






回復

使用道具 舉報

7#
ID:938266 發表于 2024-10-13 12:57 | 只看該作者
gongzhu 發表于 2024-7-31 20:03
總算熬了幾個夜搞清楚了,max31856規格書沒認真看,以為跟以往一樣下個范例改吧改吧就可以用了,其實好多案 ...

大佬,可以發一下您的代碼嗎,我最近也在調試這個模塊測水溫,但是測出來的溫度誤差很大
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人一区二区三区精 | 欧美日韩手机在线观看 | 国产乱码精品一区二区三区五月婷 | 日韩一区二区在线视频 | 久久久久久亚洲精品不卡 | 中文字幕日韩一区 | 久久亚洲欧美日韩精品专区 | 中文成人在线 | 欧美精品一区二区三区在线播放 | 男女羞羞视频大全 | 久久激情网 | 国产又爽又黄的视频 | 中文字幕高清免费日韩视频在线 | 在线视频一区二区三区 | 中文字幕一区二区三区在线乱码 | 少妇精品亚洲一区二区成人 | 亚洲a毛片| 成人免费区一区二区三区 | 在线中文av| 亚洲欧美一区二区三区1000 | 亚洲福利| 国产精品久久国产精品99 gif | www久久av | 成人av观看 | 日韩一级免费电影 | 在线观看日韩精品视频 | 天天干天天玩天天操 | 久久精品久久久久久 | 美女国产精品 | 精品免费在线 | 91九色在线观看 | 国产在线不卡 | 免费在线一区二区三区 | 国产在线精品一区二区三区 | 毛片一级片 | 国产欧美日韩一区二区三区在线 | 欧美高清视频一区 | 欧美性a视频| 久久久久久久av | 成人免费视频网站在线观看 | 久久久91精品国产一区二区三区 |