www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀] 硬件介紹:SPI:SPI是Motorola首先在其MC68HCXX系列處理器上定義的,它是一種同步的高速串行通信協(xié)議,有關(guān)SPI協(xié)議的詳細(xì)內(nèi)容,參考:SPI_互動(dòng)百科。MSP430對(duì)SPI的支持:當(dāng)msp430USART模塊控制器UxCTL的

  1. 硬件介紹:

    SPI:SPI是Motorola首先在其MC68HCXX系列處理器上定義的,它是一種同步的高速串行通信協(xié)議,有關(guān)SPI協(xié)議的詳細(xì)內(nèi)容,參考:SPI_互動(dòng)百科。

    MSP430對(duì)SPI的支持:當(dāng)msp430USART模塊控制器UxCTL的位SYNC置位時(shí),USART模塊工作于同步模式,對(duì)于149即工作于SPI模式,若是169,USART0可以支持I2C,可以通過(guò)另一控制位I2C控制,I2C位0則工作于SPI。在SPI模式下,允許單片機(jī)以確定的速率發(fā)送和接收7位或8位數(shù)據(jù)。

    同步通信與異步通信類(lèi)似;同步通信和異步通信寄存器資源一致,具體寄存器的不同位之間的功能存在差異;具體寄存器內(nèi)容參見(jiàn)TI提供的用戶指南。

    USART模塊的SPI操作可以是3線和4線,其信號(hào)如下:
    SIMO:從進(jìn)主出,主機(jī)模式下,數(shù)據(jù)輸出;從機(jī)模式下,數(shù)據(jù)輸入。
    SOMI:從出主進(jìn),主機(jī)模式下,數(shù)據(jù)輸入;從機(jī)模式下,數(shù)據(jù)輸出。
    UCLK:USART SPI模式時(shí)鐘,信號(hào)有主機(jī)輸出,從機(jī)輸入。
    STE:從機(jī)模式發(fā)送接收允許控制腳,用于4線模式,控制多主從系統(tǒng)中多個(gè)從機(jī),避免發(fā)生沖突。具體方式如下(圖截自 用戶指南):

    四線主機(jī)模式:STE為高電平,SIMO和UCLK操作正常;STE為低電平,SIMO和UCLK被置為輸入方向,主機(jī)控制權(quán)讓出。
    四線從機(jī)模式:STE為高電平,從機(jī)的發(fā)送和接收無(wú)效,且把SOMI置為輸入方向;STE為低電平,發(fā)送接收正常,SOMI也為正常輸出。

    USART模塊串行時(shí)鐘極性和相位設(shè)置:

    USART的時(shí)鐘UCLK的極性和相位由位于UxTCTL寄存器的CKPH和CKPL位控制,具體如下圖:在程序中,我分別稱之為,時(shí)鐘模式0、時(shí)鐘模式1、時(shí)鐘模式2、時(shí)鐘模式3。


    USART的波特率產(chǎn)生,SPI不同于異步通信:異步通信由UxBR1UxBR0UxMCTL三個(gè)寄存器控制,以產(chǎn)生標(biāo)準(zhǔn)頻率;而同步模式,主從設(shè)備用同一個(gè)時(shí)鐘,不再需要產(chǎn)生標(biāo)準(zhǔn)時(shí)鐘,故而不再用UxMCTL寄存器,設(shè)其值為0.

    其他的,與異步通信基本一致,這里不再細(xì)說(shuō)。具體參考用戶指南。

  2. 程序?qū)崿F(xiàn):

    程序和異步通信方式類(lèi)似:首先是初始化函數(shù),然后是讀取數(shù)據(jù)、寫(xiě)入數(shù)據(jù)函數(shù)。此程序采用和我之前的UART程序庫(kù)類(lèi)似的結(jié)構(gòu),寫(xiě)入數(shù)據(jù)后進(jìn)入低功耗等待中斷,判斷標(biāo)志位進(jìn)行寫(xiě)入數(shù)據(jù)和讀取數(shù)據(jù)。

    這里函數(shù)只實(shí)現(xiàn)430的主機(jī)模式,如需從機(jī)模式可以仿照我的程序,進(jìn)行簡(jiǎn)化實(shí)現(xiàn)。

    由于,我即將使用的SPI設(shè)備(AD7708)不是字符型設(shè)備,這里不再實(shí)現(xiàn)寫(xiě)入字符串函數(shù),也不再移植printf和scanf函數(shù),如若需要可以自己添加,printf和scanf的移植參考:MSP430程序庫(kù)<四>printf和scanf函數(shù)移植

    初始化函數(shù):SpiMasterInit,實(shí)現(xiàn)主機(jī)模式的初始化工作,函數(shù)內(nèi)容如下:

char SpiMasterInit(long baud,char dataBits,char mode,char clkMode)

{

long int brclk; //波特率發(fā)生器時(shí)鐘頻率

UxCTL |= SWRST; //初始

//反饋選擇位,為1,發(fā)送的數(shù)被自己接收,用于測(cè)試,正常使用時(shí)注釋掉

//UxCTL |= LISTEN;

UxCTL |= SYNC + MM; //SPI 主機(jī)模式

//時(shí)鐘源設(shè)置

UxTCTL &=~ (SSEL0+SSEL1); //清除之前的時(shí)鐘設(shè)置

if(baud<=16364) //

{

UxTCTL |= SSEL0; //ACLK,降低功耗

brclk = 32768; //波特率發(fā)生器時(shí)鐘頻率=ACLK(32768)

}

else

{

UxTCTL |= SSEL1; //SMCLK,保證速度

brclk = 1000000; //波特率發(fā)生器時(shí)鐘頻率=SMCLK(1MHz)

}

//------------------------設(shè)置波特率-------------------------

if(baud < 300||baud > 115200) //波特率超出范圍

{

return 0;

}

//設(shè)置波特率寄存器

int fen = brclk / baud; //分頻系數(shù)

if(fen<2)return (0); //分頻系數(shù)必須大于2

else

{

UxBR0 = fen / 256;

UxBR1 = fen % 256;

}

//------------------------設(shè)置數(shù)據(jù)位-------------------------

switch(dataBits)

{

case 7:case'7': UxCTL &=~ CHAR; break; //7位數(shù)據(jù)

case 8:case'8': UxCTL |= CHAR; break; //8位數(shù)據(jù)

default : return(0); //參數(shù)錯(cuò)誤

}

//------------------------設(shè)置模式---------------------------

switch(mode)

{

case 3:case'3': UxTCTL |= STC; USPI3ON; break; //三線模式

case 4:case'4': UxTCTL &=~ STC; USPI4ON; break; //四線模式

default : return(0); //參數(shù)錯(cuò)誤

}

//------------------------設(shè)置UCLK模式-----------------------

switch(clkMode)

{

case 0:case'0': UxTCTL &=~ CKPH; UxTCTL &=~ CKPL; break; //模式0

case 1:case'1': UxTCTL &=~ CKPH; UxTCTL |= CKPL; break; //模式1

case 2:case'2': UxTCTL |= CKPH; UxTCTL &=~ CKPL; break; //模式2

case 3:case'3': UxTCTL |= CKPH; UxTCTL |= CKPL; break; //模式3

default : return(0); //參數(shù)錯(cuò)誤

}

UxME |= USPIEx; //模塊使能

UCTL0 &= ~SWRST; // Initialize USART state machine

UxIE |= URXIEx + UTXIEx; // Enable USART0 RX interrupt

return(1); //設(shè)置成功

}

程序注釋已經(jīng)比較詳細(xì),這里不再細(xì)說(shuō);如果要改為從機(jī)模式,把時(shí)鐘設(shè)置和波特率設(shè)置去掉應(yīng)該就可以了。

發(fā)送函數(shù)和接收函數(shù):

void SpiWriteDat(char c)

{

while (TxFlag==0) SpiLpm(); // 等待上一字節(jié)發(fā)完,并休眠

TxFlag=0; //

UxTXBUF=c;

}

char SpiReadDat()

{

while (RxFlag==0) SpiLpm(); // 收到一字節(jié)?

RxFlag=0;

return(UxRXBUF);

}

發(fā)送和接收函數(shù)和異步通信里面的幾乎一樣,如果標(biāo)志位為0,則等待改變?yōu)?,然后寫(xiě)入或讀出;標(biāo)志位在中斷函數(shù)里被更改;中斷函數(shù)如下:

#pragma vector=USARTxRX_VECTOR

__interrupt void UartRx()

{

RxFlag=1;

__low_power_mode_off_on_exit();

}

#pragma vector=USARTxTX_VECTOR

__interrupt void UartTx ()

{

TxFlag=1;

__low_power_mode_off_on_exit();

}

中斷里面僅僅置標(biāo)志位后,就退出低功耗;退出后即寫(xiě)入或者讀取數(shù)據(jù)。

讀取或?qū)懭牒瘮?shù)調(diào)用的SpiLpm函數(shù):

void SpiLpm()

{

if(UxTCTL&SSEL0) LPM3; //若以ACLK 作時(shí)鐘,進(jìn)入LPM3休眠(僅打開(kāi)ACLK)

else LPM0; //若以SMCLK作時(shí)鐘,進(jìn)入LPM0休眠(不關(guān)閉SMCLK)

}


  1. 根據(jù)不同情況進(jìn)入低功耗,如果單片機(jī)其他地方不允許進(jìn)入低功耗,可以更改這個(gè)函數(shù)。

    程序部分就這么多了。需要的函數(shù)在頭文件里面聲明,方便使用。

  2. 使用示例:

    程序使用方式和之前的程序庫(kù)相同,加入c文件,包含h文件,調(diào)用初始化函數(shù)后即可掉用程序庫(kù)中的函數(shù)。


#include "msp430x16x.h" //430寄存器頭文件

#include "Spi.h" //串口通訊程序庫(kù)頭文件


void main()

{

// Stop watchdog timer to prevent time out reset

WDTCTL = WDTPW + WDTHOLD;

ClkInit();

// 主機(jī)模式,波特率25000,8位數(shù)據(jù)位,三線模式,時(shí)鐘模式0(具體見(jiàn)spi.c)

SpiMasterInit(25000,8,3,0);

_EINT();

while(1) //串口測(cè)試

{

SpiWriteDat(0X20);

char a = SpiReadDat();

}

}


  1. 這里只是一個(gè)簡(jiǎn)單的使用示例,詳細(xì)的使用,將會(huì)在下一篇給出,下一篇:MSP430程序庫(kù)<六>通過(guò)SPI操作AD7708;將會(huì)使

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

在現(xiàn)代工業(yè)和汽車(chē)領(lǐng)域,控制器局域網(wǎng)(CAN)總線作為一種可靠且高效的通信方式,廣泛應(yīng)用于各種電子設(shè)備之間的數(shù)據(jù)傳輸。在 CAN 總線系統(tǒng)中,有一個(gè)看似毫不起眼卻至關(guān)重要的元件 ——120Ω 終端電阻。這個(gè)小小的電阻,對(duì)于...

關(guān)鍵字: 控制器局域網(wǎng) 總線 通信

為增進(jìn)大家對(duì)CAN總線的認(rèn)識(shí),本文將對(duì)CAN總線協(xié)議以及CAN總線負(fù)載率的設(shè)置予以介紹。

關(guān)鍵字: CAN 指數(shù) 總線

為增進(jìn)大家對(duì)CAN總線的認(rèn)識(shí),本文將對(duì)CAN總線的特征以及高低速CAN總線的特性予以介紹。

關(guān)鍵字: CAN 指數(shù) 總線

為增進(jìn)大家對(duì)CAN總線的認(rèn)識(shí),本文將對(duì)CAN總線的工作原理、CAN總線和LIN總線的區(qū)別予以介紹。

關(guān)鍵字: CAN 指數(shù) 總線

在現(xiàn)代電子系統(tǒng)中,I2C(Inter-Integrated Circuit)總線憑借其簡(jiǎn)單性和高效性,成為了芯片間通信的常用方式,廣泛應(yīng)用于傳感器、存儲(chǔ)器、顯示驅(qū)動(dòng)等多種設(shè)備的連接。然而,在實(shí)際應(yīng)用過(guò)程中,I2C 總線通...

關(guān)鍵字: 芯片 總線 傳感器

光耦隔離:經(jīng)典且應(yīng)用廣泛光耦隔離利用光耦合器實(shí)現(xiàn)信號(hào)隔離與傳輸,其核心組件為發(fā)光二極管和光敏元件。輸入信號(hào)使發(fā)光二極管發(fā)光,光敏元件接收光信號(hào)后產(chǎn)生電信號(hào),完成信號(hào)傳輸,同時(shí)實(shí)現(xiàn)輸入與輸出的電氣隔離。光耦隔離在 CAN...

關(guān)鍵字: 光耦隔離 磁耦隔離 總線

在工業(yè)自動(dòng)化、汽車(chē)電子等領(lǐng)域,CAN(Controller Area Network)總線憑借其高可靠性、多主通信能力和良好的抗干擾性能,成為設(shè)備間數(shù)據(jù)傳輸?shù)氖走x。然而,在復(fù)雜的電磁環(huán)境中,CAN 總線易受各種干擾,導(dǎo)致...

關(guān)鍵字: CAN 總線 隔離

在工業(yè)自動(dòng)化、汽車(chē)電子等領(lǐng)域,CAN(Controller Area Network)總線憑借其高可靠性、多主通信、高速傳輸以及連接節(jié)點(diǎn)眾多等優(yōu)勢(shì),成為了應(yīng)用極為廣泛的通信協(xié)議。然而,實(shí)際應(yīng)用環(huán)境往往十分復(fù)雜,存在諸如電...

關(guān)鍵字: 總線 通信協(xié)議 隔離技術(shù)

在集成電路的通信領(lǐng)域,IIC(Inter - Integrated Circuit)總線以其簡(jiǎn)潔的二線制結(jié)構(gòu)和高效的通信能力,在嵌入式系統(tǒng)、傳感器網(wǎng)絡(luò)、消費(fèi)電子等眾多領(lǐng)域得到了廣泛應(yīng)用。然而,在 IIC 總線的實(shí)際設(shè)計(jì)與...

關(guān)鍵字: 集成電路 總線 串聯(lián)電阻

您有一個(gè)微控制器和兩個(gè)相同的傳感器,這意味著它們具有相同的I2C地址。如果沒(méi)有多路復(fù)用器或配置傳感器的I2C地址的可能性,則無(wú)法將它們連接到相同的I2C總線。但是,在提供配置任何GPIO引腳對(duì)作為I2C總線的能力的板上,...

關(guān)鍵字: ESP32 總線 傳感器
關(guān)閉