淘的一個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.
原理圖:
2024-07-22_080158.png (47.37 KB, 下載次數: 14)
下載附件
max31856
2024-7-22 08:18 上傳
代碼如下:
- //本示例在Keil開發環境下請選擇Intel的8058芯片型號進行編譯
- //若無特別說明,工作頻率一般為11.0592MHz
- #include "reg51.h"
- #include<stdio.h>
- #include<intrins.h>
- #define FOSC 11059200UL
- #define BAUD 115200
- typedef unsigned char BYTE;
- typedef unsigned int WORD;
- typedef unsigned char u8;
- typedef unsigned int u16;
- #define SR_Read 0x0F
- #define URMD 0 //0:使用定時器2作為波特率發生器
- //1:使用定時器1的模式0(16位自動重載模式)作為波特率發生器
- //2:使用定時器1的模式2(8位自動重載模式)作為波特率發生器
- sfr P1M1 = 0x91; //PxM1.n,PxM0.n =00--->Standard, 01--->push-pull
- sfr P1M0 = 0x92; // =10--->pure input, 11--->open drain
- sfr P0M1 = 0x93;
- sfr P0M0 = 0x94;
- sfr P2M1 = 0x95;
- sfr P2M0 = 0x96;
- sfr P3M1 = 0xB1;
- sfr P3M0 = 0xB2;
- sfr P4M1 = 0xB3;
- sfr P4M0 = 0xB4;
- sfr P5M1 = 0xC9;
- sfr P5M0 = 0xCA;
- sfr P6M1 = 0xCB;
- sfr P6M0 = 0xCC;
- sfr P7M1 = 0xE1;
- sfr P7M0 = 0xE2;
- sfr T2H = 0xd6; //定時器2高8位
- sfr T2L = 0xd7; //定時器2低8位
- sfr AUXR = 0x8e; //輔助寄存器
- sfr P_SW1 = 0xa2; //外設功能切換寄存器1
- #define SPI_S0 0x04 //P_SW1.2
- #define SPI_S1 0x08 //P_SW1.3
- sfr SPSTAT = 0xcd; //SPI狀態寄存器
- #define SPIF 0x80 //SPSTAT.7
- #define WCOL 0x40 //SPSTAT.6
- sfr SPCTL = 0xce; //SPI控制寄存器
- #define SSIG 0x80 //SPCTL.7
- #define SPEN 0x40 //SPCTL.6
- #define DORD 0x20 //SPCTL.5
- #define MSTR 0x10 //SPCTL.4
- #define CPOL 0x08 //SPCTL.3
- #define CPHA 0x04 //SPCTL.2
- #define SPDHH 0x00 //CPU_CLK/4
- #define SPDH 0x01 //CPU_CLK/16
- #define SPDL 0x02 //CPU_CLK/64
- #define SPDLL 0x03 //CPU_CLK/128
- sfr SPDAT = 0xcf; //SPI數據寄存器
- sbit SPISS = P2 ^ 4; //SPI從機選擇口, 連接到其它MCU的SS口
- //當SPI為一主多從模式時,請使用主機的普通IO口連接到從機的SS口
- sfr IE2 = 0xAF; //中斷控制寄存器2
- #define ESPI 0x02 //IE2.1
- void InitUart();
- void InitSPI();
- u16 WenDu;
- u8 WenDu_Time, Error;
- BYTE SPISwap(BYTE dat);
- u8 SPI_RW_Reg(u8 reg, u8 value);
- ///////////////////////////////////////////////////////////
- void Delay500ms(void) //@11.0592MHz
- {
- unsigned char data i, j, k;
- _nop_();
- _nop_();
- i = 22;
- j = 3;
- k = 227;
- do
- {
- do
- {
- while (--k);
- }
- while (--j);
- }
- while (--i);
- }
- void main()
- {
- u16 x, y;
- P0M0 = 0x00;
- P0M1 = 0x00;
- P1M0 = 0x00;
- P1M1 = 0x00;
- P2M0 = 0x00;
- P2M1 = 0x00;
- P3M0 = 0x00;
- P3M1 = 0x00;
- P4M0 = 0x00;
- P4M1 = 0x00;
- P5M0 = 0x00;
- P5M1 = 0x00;
- P6M0 = 0x00;
- P6M1 = 0x00;
- P7M0 = 0x00;
- P7M1 = 0x00;
- InitUart(); //初始化串口
- InitSPI(); //初始化SPI
- IE2 |= ESPI;
- EA = 1;
- while (1)
- {
- Delay500ms() ;
- x = SPISwap(0x00);//00~0F 都是只讀配置reg
- y = SPISwap(0x01);
- printf("MAX31856_Read00:%d ;Read01:%d\n", x, y);
- }
- }
- BYTE SPISwap(BYTE dat)
- {
- SPDAT = dat; //觸發SPI發送數據
- while (!(SPSTAT & SPIF)); //等待發送完成
- SPSTAT = SPIF | WCOL; //清除SPI狀態位
- return SPDAT; //返回SPI數據
- }
- //SPI寫寄存器
- //reg:指定寄存器地址
- //value:寫入的值
- u8 SPI_RW_Reg(u8 reg, u8 value)
- {
- u8 status;
- status = SPISwap(reg); //返回從MISO讀出的數據,status應為上次向該寄存器內寫的value
- SPISwap(value); //寫入寄存器的值
- return status; // 返回狀態值
- }
- ///////////////////////////////////////////////////////////
- void InitUart()
- {
- SCON = 0x5a; //設置串口為8位可變波特率
- #if URMD == 0
- T2L = (65536 - (FOSC / 4 / BAUD));
- T2H = (65536 - (FOSC / 4 / BAUD)) >> 8;
- AUXR = 0x14; //T2為1T模式, 并啟動定時器2
- AUXR |= 0x01; //選擇定時器2為串口1的波特率發生器
- #elif URMD == 1
- AUXR = 0x40; //定時器1為1T模式
- TMOD = 0x00; //定時器1為模式0(16位自動重載)
- TL1 = (65536 - (FOSC / 4 / BAUD));
- TH1 = (65536 - (FOSC / 4 / BAUD)) >> 8;
- TR1 = 1; //定時器1開始啟動
- #else
- TMOD = 0x20; //設置定時器1為8位自動重裝載模式
- AUXR = 0x40; //定時器1為1T模式
- TH1 = TL1 = (256 - (FOSC / 32 / BAUD));
- TR1 = 1;
- #endif
- }
- ///////////////////////////////////////////////////////////
- void InitSPI()
- {
- ACC = P_SW1; //可用于測試U7,U7使用的是第二組SPI控制Flash
- ACC &= ~(SPI_S0 | SPI_S1); //SPI_S0=1 SPI_S1=0
- ACC |= SPI_S0; //(<b>P2.4///SPISS, P2.3/MOSI_2, P2.2/MISO_2, P2.1/SCLK_2</b>)
- P_SW1 = ACC;
- SPDAT = 0; //初始化SPI數據
- SPSTAT = SPIF | WCOL; //清除SPI狀態
- SPCTL = SPEN | MSTR; //設置SPI為主模式
- //SPCTL = SPEN | MSTR | SSIG | SPDLL; //主機模式 忽略SS引腳
- }
復制代碼 有沒遇到同類問題的高手請指點一下。
原資料包:
MAX31856模塊資料.zip
(1.47 MB, 下載次數: 6)
2024-7-22 08:17 上傳
點擊文件名下載附件
max31856
|