娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年05月03日(星期六)

2018年05月03日 | MSP430 SPI總線詳解

發(fā)布者:心有歸屬 來源: eefocus關(guān)鍵字:MSP430  SPI總線 手機(jī)看文章 掃描二維碼
隨時隨地手機(jī)看文章
  1. 硬件介紹:

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

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

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

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

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

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

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

    image


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

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

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

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

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

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

    

    UxCTL |= SWRST;                 //初始

    

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

    //UxCTL |= LISTEN;

    

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

    

    //時鐘源設(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)比較詳細(xì),這里不再細(xì)說;如果要改為從機(jī)模式,把時鐘設(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)?,然后寫入或讀出;標(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)志位后,就退出低功耗;退出后即寫入或者讀取數(shù)據(jù)。

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

void SpiLpm()

{

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

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

}


  1. 根據(jù)不同情況進(jìn)入低功耗,如果單片機(jī)其他地方不允許進(jìn)入低功耗,可以更改這個函數(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();

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

    SpiMasterInit(25000,8,3,0);

    _EINT(); 

    

    

    while(1)                    //串口測試

    {

        SpiWriteDat(0X20);

        char a = SpiReadDat();

    }

}


  1. 這里只是一個簡單的使用示例,詳細(xì)的使用,將會在下一篇給出,下一篇:MSP430程序庫<六>通過SPI操作AD7708;將會使用今天的程序庫,完成SPI的通信部分。

  2. 注意事項:

    SPI是全雙工通信,每次寫入(發(fā)送)8位/7位數(shù)據(jù)的同時,430的SPI主模塊都會在發(fā)送后半個時鐘周期讀取采樣的0/1信號,存入接收緩沖寄存器,所以,每次的寫入,均有數(shù)據(jù)讀取,但不一定是從設(shè)備發(fā)送回來的,這個地方在使用430主機(jī)模式的時候必須注意,很容易出錯(我也是在調(diào)試AD7708的時候才注意到這個地方的);SPI的函數(shù)已經(jīng)添加SpiWriteData函數(shù),這個函數(shù)會在發(fā)送的同時返回發(fā)送完成半個時鐘周期后的接收到的數(shù)據(jù),方便使用;不建議使用前面的發(fā)送和讀取函數(shù),很容易出錯;建議使用剛添加的這個函數(shù),程序庫已經(jīng)更新,可以重新下載。函數(shù)SpiWriteData:


char SpiWriteData(char c)

{

    SpiWriteDat(c);

    return SpiReadDat();

}

發(fā)送后讀取即可,程序比較簡單。


新的示例程序:


void main()

{

    // Stop watchdog timer to prevent time out reset

    WDTCTL = WDTPW + WDTHOLD;

    

    ClkInit();

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

    SpiMasterInit(25000,8,3,0);

    _EINT(); 

    

    

    while(1)                    //串口測試

    {

        SpiWriteData(0X20);     //只寫入

        char a = SpiWriteData(0xff);    //只讀取

    }

}


關(guān)鍵字:MSP430  SPI總線 引用地址:MSP430 SPI總線詳解

上一篇:MSP430 開發(fā)注意事項要求
下一篇:MSP430 移植printf和scanf

推薦閱讀

I Finally Tamed the 3D PrinTIng Robot and Now the Leapfrog Creatr HS Is My Friend A few months ago, I wro a about an interesng?blog by Kees Kamper, who h “tamed” the robot he had won from Dutch 3D printer manufacturer Leapfrog and started recounTIng the adventures he’d had...
“畫質(zhì)好的讓人吃驚”、“REGZA引擎真的特別的好”、“比想象的聲音要好”、“屏幕和邊框都很薄”、“沒有不滿,非常滿意”……在日本彩電市場,一向是本土品牌更具號召力。但透過日前日本用戶在網(wǎng)絡(luò)平臺對海信系電視的交口稱贊,可以看到這種傳統(tǒng)的消費(fèi)觀念正悄然生變,也折射出中國品牌海信在日本市場的強(qiáng)勢崛起。另據(jù)全球兩大權(quán)威機(jī)構(gòu)IHS和GFK數(shù)據(jù)顯示...
IT之家5月2日消息 據(jù)XDA Developer報道,有關(guān)Redmi K30i手機(jī)的消息逐漸增多,值得注意的是近日Redmi K30的工信部認(rèn)證信息發(fā)生變化,其主攝像頭增加了4800萬像素的版本。  IT之家了解到,有XDA開發(fā)人員也在最新的MIUI系統(tǒng)代碼中找到了一串新字符,也佐證了新款Redmi K30i將搭載4800萬像素主攝。Redmi K30 5G的代號是“畢加索”。該字符串...

史海拾趣

問答坊 | AI 解惑

應(yīng)用技巧/單片機(jī)系統(tǒng)中的紅外通信接口

本文結(jié)合復(fù)費(fèi)率電能表中紅外通信的設(shè)計實(shí)從事貿(mào)易,介紹了單片機(jī)系統(tǒng)中紅外通信的軟硬件設(shè)計方法,并給出了具體的電路原理和通信源程序。…

查看全部問答∨

非接觸式傳感器

最近老板讓查一下非接觸式傳感器,可以紅外,或者霍爾,其他的也可以考慮。     具體要執(zhí)行的任務(wù)如下     他跟我描述的大概和電梯差不多,就是一個上下移動的物體,當(dāng)?shù)竭_(dá)預(yù)定位置的時候發(fā)出通過傳感器發(fā)出一個信號,以前用 ...…

查看全部問答∨

DSP Group and Lantiq Complete Interoperability Testing

DSP Group and Lantiq Complete Interoperability Testing for Home Gateways and Digital Cordless Handsets DSP Group, Inc™, a leading global provider of wireless chipset solutions for converged communication ...…

查看全部問答∨

請教 怎么對地址總線的某一位賦值???

我的硬件是PXA270 通過16位數(shù)據(jù)總線連接到64MBYTE的FLASH P33,地址總線是26位 p33是由兩塊32M的flash組成的,在程序中不能同時訪問上下兩塊FLASH的地址 而是需要有一個地址總線,即最高位的A25作為內(nèi)部片選,選擇當(dāng)前訪問的是BOTTOM 還是top flas ...…

查看全部問答∨

新買電腦總是無故死機(jī),請教高手?

幾個月前新買電腦總是無故死機(jī),請教高手? 相關(guān)癥狀如下:     1.畫面定格,除非重啟或關(guān)機(jī),其它一切操作均無效,沒有一點(diǎn)反應(yīng)。     2.玩反恐等游戲時死機(jī)頻率大約一個半小時一次;放電影大約四小時一次。第一次開機(jī)到死 ...…

查看全部問答∨

采用TI C2000開發(fā)的太陽能逆變器(一)-TI技術(shù)研討會

基于 C2000 和 Piccolo MCU的新型太陽能套件,助力打造更環(huán)保世界。該新型太陽能套件為可再生能源市場提供先進(jìn)外設(shè)、針對應(yīng)用的開發(fā)硬件、原理圖 (schematics)、全面豐富的軟件算法庫和業(yè)界領(lǐng)先的開發(fā)環(huán)境,使設(shè)計人員能簡易地開發(fā)太陽能逆變器設(shè)計 ...…

查看全部問答∨

如何用示波器直接測量和補(bǔ)償高頻電纜的損耗?

前文提到,對希望對 電纜損耗進(jìn)行補(bǔ)償?shù)墓こ處煟麄冊跍y量和表征同軸電纜的時,可能選擇不同方法。到目前為止,這些方法包括矢量網(wǎng)絡(luò)分析儀(VNA)、時域反射計 (TDR)、以及仿真工具(如 ADS之類的),方法各異,但共同點(diǎn)都是得到電纜的S參數(shù) ...…

查看全部問答∨

AD采集數(shù)據(jù)的幅度

AD采集的數(shù)據(jù)通過FPGA控制SRAM存儲后再由PCI傳輸?shù)缴衔粰C(jī),16K數(shù)據(jù)長度,但是采集上來的數(shù)據(jù)幅度不一致,請問是怎么回事?…

查看全部問答∨

個人閑置FPGA開發(fā)板

這是本人在淘寶上購得的FPGA開發(fā)板的地址,http://item.taobao.com/item.htm?spm=a230r.1.10.12.XBn1Ov&id=13851235569,內(nèi)有詳細(xì)內(nèi)容,可供大家了解,由于個人原因,買后一直沒用過,可以說是全新的,現(xiàn)在要畢業(yè)實(shí)習(xí)離校了,想低價出售,個人的理 ...…

查看全部問答∨
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 泊头市| 芦山县| 和林格尔县| 西盟| 阳谷县| 河西区| 虎林市| 乐都县| 新闻| 壶关县| 九寨沟县| 肃南| 沈丘县| 大冶市| 镇平县| 郴州市| 恩施市| 社旗县| 东辽县| 敖汉旗| 长子县| 马公市| 秦安县| 琼结县| 遂宁市| 广宁县| 成武县| 沛县| 政和县| 常熟市| 咸阳市| 布拖县| 石城县| 黑龙江省| 清原| 昌宁县| 诸城市| 昔阳县| 清远市| 古交市| 延川县|