『壹』 怎麼實現單片機和PC機進行SPI通訊
實現單片機和PC機進行SPI通訊方法:
1:電路設計
設計的電路,利用兩片AT89C52晶元,一片做為發送模塊,一片做為接收模塊。分別編寫發送和接收程序,實現數據的發送和接受。通過LED顯示接收到的數據。通過示波器觀察輸出的波形。
2:編寫程序
根據設計好的電路及題目要求分別編寫數據發送程序和數據接收程序。 ①:數據發送程序 #define
uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//--------------------------- #include <REG52.H>
#include<STDIO.H>
//--------------------------- sbit SPICLK = P1^0; //時鍾信號 sbit MOSI = P1^1; //主器件數據輸出,從器件數據輸入 sbit MISO = P1^2; //主器件數據輸入,從器件數據輸出
sbit SS = P1^3; //從器件使能信號
void Dat_Transmit(uchar dat) //發送數據程序
{ uchar i,datbuf;
datbuf=dat;
SS=1; while(SS){;} for(i=0;i<8;i++) {
while(SPICLK){;} if(datbuf&0x80) MISO=1; else
MISO=0;
datbuf=(datbuf<<1); while(~SPICLK){;}
}
}
void main(void)
{ uchar i; while(1) {
for(i=0;i<10;i++) {
Dat_Transmit(i);
}
}
}
②:數據接收程序 #define uchar unsigned char
#define uint unsigned int #define ulong
unsigned long
//--------------------------- #include <REG52.H>
#include<STDIO.H>
//--------------------------- sbit SPICLK = P1^0; //時鍾信號 sbit MOSI = P1^1; //主器件數據輸出,從器件數據輸入 sbit MISO = P1^2; //主器件數據輸入,從器件數據輸出 sbit SS = P1^3; //從器件使能信號
//--------------------------- void Nop(void)
{ ;
}
void Delay(uchar t) { while(t--){;}
}
uchar Data_Receive(void) //數據接收程序
{ uchar i,dat=0,temp; bit
bt;
SPICLK=1; MISO=1; SS=0;
//選中器件
Nop(); Nop();
for(i=0;i<8;i++) { SPICLK=1;
Nop()
Nop(); Nop(); SPICLK=0; Nop(); Nop();
bt=MISO; if(bt)
temp=0x01;
else
temp=0x00;
dat=(dat<<1);
dat=(dat|temp);
}
SS=1; SPICLK=1;
return dat;
}
void main(void)
{ uchar exdat; uchar i=0;
uchar code
table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F}; P2=0;
while(1) { exdat=Data_Receive(); P0=table[exdat];
for(i=0;i<200;i++)
Delay(200);
}
}
3:電路模擬
將數據發送程序生成的HEX文件載入到發送數據的模塊,將數據接收程序生成的HEX文件載入到接收數據的模塊。在輸出埠連接LED燈等到輸出信息,利用示波器觀察輸出波形。
4:SPI匯流排簡介
SPI ( Serial Peripheral Interface ——串列外設介面) 匯流排是Motorola公司推出的一種同步串列介面技術。SPI匯流排系統是一種同步串列外設介面,允許MCU(微控制器)與各種外圍設備以串列方式進行通信、數據交換。外圍設備包括FLASHRAM、A/ D 轉換器、網路控制器、MCU 等。SPI,是一種高速的,全雙工,同步的通信匯流排,並且在晶元的管腳上只佔用四根線,節約了晶元的管腳,同時為PCB的布局上節省空間,提供方便,正是出於這種簡單易用的特性,現在越來越多的晶元集成了這種通信協議。其工作模式有兩種:主模式和從模式。SPI是一種允許一個主設備啟動一個從設備的同步通訊的協議,從而完成數據的交換。也就是SPI是一種規定好的通訊方式。這種通信方式的優點是佔用埠較少,一般4根就夠基本通訊了(不算電源線)。同時傳輸速度也很高。一般來說要求主設備要有SPI控制器(也可用模擬方式),就可以與基於SPI的晶元通訊了。
利用SPI匯流排可在軟體的控制下構成各種系統。如1個主MCU和幾個從MCU、幾個從MCU相互連接構成多主機系統(分布式系統)、1個主MCU和1個或幾個從I/O設備所構成的各種系統等。在大多數應用場合,可使用1個MCU作為主控機來控制數據,並向1個或幾個從外圍器件傳送該數據。從器件只有在主機發命令時才能接收或發送數據。其數據的傳輸格式是高位(MSB)在前,低位(LSB)在後。
當一個主控機通過SPI與幾種不同的串列I/O晶元相連時,必須使用每片的允許控制端,這可通過MCU的I/O埠輸出線來實現。但應特別注意這些串列I/O晶元的輸入輸出特性:首先是輸入晶元的串列數據輸出是否有三態控制端。平時未選中晶元時,輸出端應處於高阻態。
若沒有三態控制端,則應外加三態門。否則MCU的MISO端只能連接1個輸入晶元。其次是輸出晶元的串列數據輸入是否有允許控制端。因為只有在此晶元允許時,SCK脈沖才把串列數據移入該晶元;在禁止時,SCK對晶元無影響。若沒有允許控制端,則應在外圍用門電路對SCK進行控制,然後再加到晶元的時鍾輸入端;當然,也可以只在SPI匯流排上連接1個晶元,而不再連接其它輸入或輸出晶元。
SPI介面是在CPU和外圍低速器件之間進行同步串列數據傳輸,在主器件的移位脈沖下,數據按位傳輸,高位在前,低位在後,為全雙工通信,數據傳輸速度總體來說比I2C匯流排要快,速度可達到幾Mbps。
5:SPI匯流排工作原理
SPI匯流排系統是一種同步串列外設介面,它可以使MCU與各種外圍設備以串列方式進行通信以交換信息。SPI有三個寄存器分別為:控制寄存器SPCR,狀態寄存器SPSR,數據寄存器。外圍設備、網路控制器、LCD顯示驅動器、A/D轉換器和MCU等。
介麵包括以下四種信號:
(1)MOSI – 主器件數據輸出,從器件數據輸入;
(2)MISO – 主器件數據輸入,從器件數據輸出;
(3)SCLK – 時鍾信號,由主器件產生;
(4) SS –從器件使能信號,由主器件控制,有的IC會標注為CS(Chip select)。 在點對點的通信中,SPI介面不需要進行定址操作,且為全雙工通信,顯得簡單高效。
『貳』 關於單片機IO口模擬SPI通信
有沒有寫進去,讀回來就知道了。另外你的讀函數中if(SPI_DI==1) dat|=0x01;else dat&=0x01;這一段,置一對了,但是清零錯了,應該是dat&=0xfe;
『叄』 求51單片機模擬SPI通訊的C程序,最好帶詳解!謝謝
調試已經通過
///////////////////////////spi.h/////////////////////////////
#ifndef
SPI_H
#define
SPI_H
#include
<stc12le5a60s2.h>
#include
<spi.h>
//sfr
P4
=
0xe8;
//STC12LE5A60S2單片機自帶SPI控制器連接
//sbit
VCC1
=
P2^0;//
VCC1
NO
USE
//sbit
SON
=
P1^6
;//
MISO
//sbit
SIN
=
P1^5
;//
MOSI
//sbit
SCKN
=
P1^7
;
//
SCK
sbit
CSN
=
P1^4
;//
28J60
--
CS
//sbit
RSTN
=
P3^5
;
//RST,
no
use
//sbit
INTN
=
P3^3
;
//
INT,
no
use
void
init_spi(void);
void
WriteByte(u8_t
temp);
u8_t
ReadByte(void);
#endif
////////////////////////////////////////////////////////////////
///////////////////////////spi.c/////////////////////////////
#include<spi.h>
//STC12LE5A60S2單片機自帶SPI控制器連接
void
init_spi(void)
{
//SSIG
=
1;
//忽略SS腳
//SPEN
=
1;
//允許SPI工作
//DORD
=
0;
//先傳高位MSB
//MSTR
=
1;
//設置單片機為主機
SPCTL
=
0xD0;
//SPI
Control
Register
SSIG
SPEN
DORD
MSTR
CPOL
CPHA
SPR1
SPR0
0000,0100
SPSTAT
=
0xC0;
//
//IE2
|=
0x02;
//允許SPI中斷控制位
}
void
WriteByte(u8_t
temp)
{
SPDAT
=
temp;
while(!(SPSTAT
&
0x80));
SPSTAT
=
0xC0;
}
u8_t
ReadByte(void)
{
idata
u8_t
temp;
//SPSTAT
=
0xC0;
SPDAT
=
0x00;
while(!(SPSTAT
&
0x80));
temp
=
SPDAT;
SPSTAT
=
0xC0;
return
temp;
}
////////////////////////////////////////////////////////////////
『肆』 pic單片機如何模擬SPI方式
按照SPI介面要求的時序,讓一個埠模擬時鍾,一埠模擬SDO輸出,一個模擬SDI輸入,編程讓相關的引腳按照SPI時序的要求高或低電平,或者讀時判斷高低輸出相應的接收位就可以了,這樣也是很方便的,但前提是你要對SPI通信的細節要了解的非常清楚。
『伍』 請教高手,用51單片機軟體模擬SPI從機,需要注意哪些問題
0、樓上你真逗……不要誤導人家……最討厭用這種濫造的答案糊弄人,網路能不能想想辦法?
1、我不是大嬸,只是學過單片機和arm
2、SPI有主從機之分,其實我覺得主從機從通信角度來講地位相同,區別是主機為從機提供時鍾信號,並且控制掛在匯流排上的多個從機的選通信號來時分復用數據匯流排。
3、模擬SPI時,你需要確定SPI通信時的時序,也就是類似許多集成電路datasheet里的通信時序圖所畫的那樣,包括確定通信埠無信息也就是不通信時的電平高低,確定獲取信息是在時鍾上升沿還是下降沿,以及需要確定一下你通過SPI通信時的幀結構,例如8位或者16位,不過51大多數都是8位應該。
4、網上應該有配置SPI的常式,找出來一行一行讀,理解了就好了。
5、推薦使用arm
『陸』 51單片機怎樣實現SPI通訊
用傳統的51單片機實現SPI通訊,需要用I/O腳來模擬SPI協議,這比較麻煩。
選用STC8系列單片機,就具有了SPI介面了 ,只需要對寄存器操作就行了。方便了很多了。如下圖,這是STC8系列中的4個子系列,還有其它的子系列,就不再列舉了。
『柒』 如何用單片機模擬SPI來訪問SD卡阿
spi
跟i2c
比較像.
i2c
可以用gpio來模擬.
spi
也應該可以的吧.
『捌』 用C51單片機模擬的SPI波特率怎麼設定
SPI不用設定波特率,用時鍾管腳,每個時鍾一位數據