日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

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

  1. 硬件介紹:

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

{

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

UxCTL |= SWRST; //初始

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

//UxCTL |= LISTEN;

UxCTL |= SYNC + MM; //SPI 主機模式

//時鐘源設(shè)置

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

if(baud<=16364) //

{

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

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

}

else

{

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

brclk = 1000000; //波特率發(fā)生器時鐘頻率=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ù)錯誤

}

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

switch(mode)

{

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

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

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

}

//------------------------設(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ù)錯誤

}

UxME |= USPIEx; //模塊使能

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

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

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

}

程序注釋已經(jīng)比較詳細,這里不再細說;如果要改為從機模式,把時鐘設(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ù)和異步通信里面的幾乎一樣,如果標志位為0,則等待改變?yōu)?,然后寫入或讀出;標志位在中斷函數(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();

}

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

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

void SpiLpm()

{

if(UxTCTL&SSEL0) LPM3; //若以ACLK 作時鐘,進入LPM3休眠(僅打開ACLK)

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

}


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

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

  2. 使用示例:

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


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

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


void main()

{

// Stop watchdog timer to prevent time out reset

WDTCTL = WDTPW + WDTHOLD;

ClkInit();

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

SpiMasterInit(25000,8,3,0);

_EINT();

while(1) //串口測試

{

SpiWriteDat(0X20);

char a = SpiReadDat();

}

}


  1. 這里只是一個簡單的使用示例,詳細的使用,將會在下一篇給出,下一篇:MSP430程序庫<六>通過SPI操作AD7708;將會使

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

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

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

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

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

為增進大家對CAN總線的認識,本文將對CAN總線的特征以及高低速CAN總線的特性予以介紹。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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