新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > msp430F149與cc2500通訊啟用USART1,SPI初始化

        msp430F149與cc2500通訊啟用USART1,SPI初始化

        作者: 時(shí)間:2016-11-13 來源:網(wǎng)絡(luò) 收藏
        剛開始接觸這個(gè)SPI,又是與cc2500,看著英文手冊(cè),弄了老半天,才把讀寫寄存器給弄清,分享一下:
        //=========================================================
        //本模塊為spi通訊模塊,程序啟用USART1,針對(duì)與cc2500的相互通訊
        //=========================================================
        #include<msp430x14x.h>
        #include"spi.h"
        #include"cc2500_def.h"
        #define SPI_SEL P5SEL
        #define SPI_DIR P5DIR
        #define SPI_IN P5IN
        #define SPI_OUT P5OUT
        #define CSn BIT0
        #define SIMO BIT1
        #define SOMI BIT2
        #define UCLK BIT3
        void init_spi(void)//msp430 spi初始化 同步串行接口
        { SPI_DIR |= CSn; //CS 禁止
        SPI_OUT |= CSn;
        U1CTL |= SWRST; // 芯片復(fù)位
        U1CTL |= CHAR + SYNC + MM; // 8-bit SPI 主機(jī)模式
        U1TCTL |= CKPH + SSEL1 + SSEL0 + STC; // SMCLK,3線模式
        U1BR0 = 0x02; // UCLK/2
        U1BR1 = 0x00; // 0
        U1MCTL = 0x00;
        ME2 |= USPIE1; // 使能SPI #define USPIE1 (0x10)
        UCTL1 &= ~SWRST; // 取消復(fù)位
        SPI_SEL |= SIMO + SOMI + UCLK;//引腳功能選擇,第二功能
        SPI_DIR |= SIMO + UCLK; // 端口方向設(shè)置
        }
        //寫入寄存器,是8位address + 8位data, 8位地址為 0 B A5 A4 A3 A2 A1 A0
        //其中,0表示write option B表示burst寫的時(shí)候,置1
        //在突發(fā)方式寫cc2500寄存器
        //U1TXBUF = addr + CC2500_WRITE_BURST; 發(fā)送地址,起始地址加突發(fā)頭#define CC2500_WRITE_BURST 0x40
        //寫cc2500寄存器
        void spi_WriteReg(unsigned char addr,unsigned char value)
        {
        SPI_OUT &= ~CSn; // CS 使能
        while (SPI_IN & SOMI); // 等待cc2500準(zhǔn)備好 CHIP_RDYn,stays high until power and crystal have stabilized .
        //Shoule always be low when using the SPI interface.
        IFG2 &= ~UTXIFG1; // 清除標(biāo)志,USART1發(fā)送中斷標(biāo)志位
        U1TXBUF = addr; // 發(fā)送地址  UxTXBUF 發(fā)送數(shù)據(jù)寄存器
        while (!(IFG2 & UTXIFG1));// 等待發(fā)送完成
        IFG2 &= ~UTXIFG1; // 清除標(biāo)志
        U1TXBUF = value; // 發(fā)送內(nèi)容
        while (!(IFG2 &UTXIFG1));// 等待完成
        SPI_OUT |= CSn; // CS 禁止
        }
        //突發(fā)方式寫cc2500寄存器
        void spi_WriteBurstReg(unsigned char addr,unsigned char *buffer,unsigned char count)
        {
        unsigned char i;
        SPI_OUT &= ~CSn; // CS 使能
        while (SPI_IN & SOMI); // 等待cc2500準(zhǔn)備好
        IFG2 &= ~UTXIFG1 ;
        U1TXBUF = addr + CC2500_WRITE_BURST; // 發(fā)送地址,起始地址加突發(fā)頭#define CC2500_WRITE_BURST 0x40
        while (!(IFG2 & UTXIFG1)); // 等待發(fā)送完成
        for (i = 0; i < count; i++)
        {
        U1TXBUF = buffer[i]; // 發(fā)送內(nèi)容
        while (!(IFG2 & UTXIFG1)); // 等待完成
        IFG2 &= ~UTXIFG1 ;
        }
        // IFG2 &= ~URXIFG1;
        //while(!(IFG2 & UTXIFG1));
        SPI_OUT |= CSn; // CS 禁止
        }
        //讀寄存器,是8位address + 8位data, 8位地址為 1 B A5 A4 A3 A2 A1 A0
        //其中,1表示read option B表示burst讀的時(shí)候,置1
        //burst read cc2500寄存器
        // U1TXBUF = (addr | CC2500_READ_BURST);發(fā)送地址#define CC2500_READ_BURST 0xC0
        //讀cc2500寄存器
        unsigned char spi_ReadReg(unsigned char addr)
        {
        unsigned char x;
        SPI_OUT &= ~CSn; // CS 使能
        while (SPI_IN & SOMI);// 等待cc2500準(zhǔn)備好
        IFG2 &= ~UTXIFG1; //清除標(biāo)志
        U1TXBUF = (addr | CC2500_READ_SINGLE); // 發(fā)送地址 #define CC2500_READ_SINGLE 0x80
        while (!(IFG2 & UTXIFG1)); //等待發(fā)送地址完成
        IFG2 &= ~UTXIFG1; //清除標(biāo)志
        U1TXBUF = 0; //啟動(dòng)傳輸,以便讀取
        while (!(IFG2&URXIFG1)); //等待接收完成
        x = U1RXBUF; //讀取內(nèi)容
        while(!(IFG2 & UTXIFG1)); //等待 U1TXBUF = 0發(fā)送完成
        SPI_OUT |= CSn; //CS 禁止
        return x;
        }
        //突發(fā)方式讀cc2500寄存器
        void spi_ReadBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count)
        {
        unsigned int i;
        SPI_OUT &= ~CSn; // CS使能
        while (SPI_IN & SOMI);// 等待芯片準(zhǔn)備好
        IFG2 &= ~UTXIFG1; //清除標(biāo)志
        U1TXBUF = (addr | CC2500_READ_BURST); //發(fā)送地址#define CC2500_READ_BURST 0xC0
        while (!(IFG2 & UTXIFG1)); //等待完成
        for (i = 0; i < count; i++)
        {
        U1TXBUF = 0;
        while (!(IFG2 & URXIFG1)); // 等待
        buffer[i] = U1RXBUF; // 接收
        while(!(IFG2 & UTXIFG1)); //等待 U1TXBUF = 0發(fā)送完成
        IFG2 &= ~UTXIFG1; //清除標(biāo)志
        }
        SPI_OUT |= CSn; //CS 禁止
        }
        //讀cc2500狀態(tài)
        unsigned char spi_ReadStatus(unsigned char addr)
        {
        unsigned char x;
        SPI_OUT &= ~CSn; // CS 使能
        while (SPI_IN & SOMI);// 等待cc2500準(zhǔn)備好
        IFG2 &= ~UTXIFG1; // 清除標(biāo)志
        U1TXBUF = (addr | CC2500_READ_SINGLE); // 發(fā)送地址 #define CC2500_READ_BURST 0x80
        while (!(IFG2 & UTXIFG1)); // 等待發(fā)送完成
        IFG2 &= ~UTXIFG1; // 清除標(biāo)志
        U1TXBUF = 0; // 啟動(dòng)傳輸
        while (!(IFG2&URXIFG1)); // 等待接收完成
        x = U1RXBUF; // 讀取數(shù)據(jù)
        while(!(IFG2 & UTXIFG1)); //等待 U1TXBUF = 0發(fā)送完成
        SPI_OUT |= CSn; // CS 禁止
        return x;
        }



        關(guān)鍵詞: msp430F149cc2500USART1SPI初始

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 霞浦县| 吉林市| 吉隆县| 民权县| 凤凰县| 芜湖县| 海晏县| 南通市| 高陵县| 玉龙| 遵化市| 西青区| 舒兰市| 依安县| 宝清县| 黑龙江省| 磴口县| 瑞丽市| 定边县| 台前县| 桦南县| 西安市| 玉门市| 定安县| 龙泉市| 泽普县| 义马市| 洛浦县| 田东县| 凌源市| 岐山县| 闸北区| 林州市| 仪陇县| 襄汾县| 桐城市| 黎平县| 昭苏县| 辽宁省| 恩平市| 贺州市|