<address id="tnvjh"></address>
    <form id="tnvjh"><listing id="tnvjh"><meter id="tnvjh"></meter></listing></form>

      <form id="tnvjh"></form>

      <address id="tnvjh"><th id="tnvjh"></th></address>

        專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        新唐M051 spi使用程序

        作者:huqin   來源:本站原創   點擊數:  更新時間:2014年09月01日   【字體:

        #include "SPI.h"
        #define DEBUGMSG printf
        STATIC UINT32  g_unSpi0Rx0Data = 0, g_unSpi1Rx0Data = 0;
        /****************************************
        *函數名稱:Spi0MasterInit
        *輸    入:無
        *輸    出:無
        *功    能:SPI0初始化為主機模式
        ******************************************/
        VOID Spi0MasterInit(VOID)
        {                                    
            P1_MFP &= ~(P14_AIN4_SPI0SS | P15_AIN5_SPI0MOSI | P16_AIN6_SPI0MISO | P17_AIN7_SPI0CLK); 
         P1_MFP |= (SPI0SS | SPI0MOSI | SPI0MISO | SPI0CLK) ;      //使能SPI0相關引腳
         ENABLE_SPI0_CLK;         //SPI0時鐘使能                  
            SPI0_SSR &= ~LVL_H;           //從機選擇選擇信號通過低電平激活
            SPI0_CNTRL &= ~LSB_FIRST;    //優先發送/接收最高有效位
            SPI0_CNTRL &= ~CLKP_IDLE_H;      //SCLK空閑時為低電平
            SPI0_CNTRL |= TX_NEG_F;       //SDO 信號在SPICLK的下降沿改變
            SPI0_CNTRL &= ~RX_NEG_F;       //SDI 信號在SPICLK上升沿鎖存
            CLKDIV &= 0xFFFFFFF0;               //HCLK_N = 0, Pclk = SYSclk/(HCLK_N+1)
            SPI0_DIVIDER &= 0xFFFF0000;         //SPIclk = Pclk/((HCLK_N+1)*2)
            SPI0_DIVIDER |= 0x00000002;   
            SET_SPI0_MASTER_MODE;            //SPI0工作在主機模式
            ENABLE_SPI0_AUTO_SLAVE_SLECT;    //使能自動從機選擇
            SPI0_SSR |= SSR_ACT;     
        }
        /****************************************
        *函數名稱:Spi0Send1W
        *輸    入:ulData    發送的數據
                  ucLength  數據長度
        *輸    出:無
        *功    能:SPI0發送數據
        ******************************************/
        VOID Spi0Send1W(UINT32 ulData, UINT8 ucLength)
        {
            SPI0_CNTRL &= TX_NUM_ONE;      
            Spi0Length(ucLength);
            SPI0_TX0 = ulData;
            SPI0_CNTRL |= GO_BUSY;         
        }

         

        /****************************************
        *函數名稱:GetSlaveID
        *輸    入:無
        *輸    出:無
        *功    能:獲取從機ID
        ******************************************/
        VOID GetSlaveID(VOID)
        {
            Spi0Send1W(0x00000055, 0x08);
            while((SPI0_CNTRL & GO_BUSY)!=0);

            Spi0Send1W(0x00000000, 0x08);
            while((SPI0_CNTRL & GO_BUSY)!=0);
            g_unSpi0Rx0Data = SPI0_RX0;
        }
        /****************************************
        *函數名稱:Spi0Length
        *輸    入:ucLength 數據長度
        *輸    出:無
        *功    能:設置SPI0數據長度
        ******************************************/
        VOID Spi0Length(UINT8 ucLength)
        {
             if(ucLength <= 0x20)
            {
                if((ucLength & 0x01) == 0)
                    SPI0_CNTRL &= ~(1<<3);
                else
                    SPI0_CNTRL |= (1<<3);
                if((ucLength & 0x02) == 0)
                    SPI0_CNTRL &= ~(1<<4);
                else
                    SPI0_CNTRL |= (1<<4);

                if((ucLength & 0x04) == 0)
                    SPI0_CNTRL &= ~(1<<5);
                else
                    SPI0_CNTRL |= (1<<5);

                if((ucLength & 0x08) == 0)
                    SPI0_CNTRL &= ~(1<<6);
                else
                    SPI0_CNTRL |= (1<<6);

                if((ucLength & 0x10) == 0)
                    SPI0_CNTRL &= ~(1<<7);
                else
                    SPI0_CNTRL |= (1<<7);
            }
        }
        /****************************************
        *函數名稱:Spi1SlaveInit
        *輸    入:無
        *輸    出:無
        *功    能:SPI1初始化為從機
        ******************************************/
        VOID Spi1SlaveInit(VOID)
        {                              
            P0_MFP &= ~(P04_AD4_SPI1SS | P05_AD5_SPI1MOSI | P06_AD6_SPI1MISO | P07_AD7_SPI1CLK); 
         
         P0_MFP |= (SPI1SS | SPI1MOSI | SPI1MISO | SPI1CLK) ;      //使能SPI1相關引腳 
         ENABLE_SPI1_CLK; 
         SPI1_SSR &= LTRIG_EDG;         //從機輸入邊沿觸發
            SPI1_SSR &= ~LVL_H;          //從機選擇選擇信號通過低電平激活

            SPI1_CNTRL &= ~LSB_FIRST;      //優先發送/接收最高有效位
            SPI1_CNTRL &= ~CLKP_IDLE_H;      //SCLK空閑時為低電平
            SPI1_CNTRL |= TX_NEG_F;       //SDO 信號在SPICLK的下降沿改變
            SPI1_CNTRL &= ~RX_NEG_F;       //SDI 信號在SPICLK上升沿鎖存

            CLKDIV &= 0xFFFFFFF0;               //HCLK_N = 0, Pclk = SYSclk/(HCLK_N+1)
            SPI1_DIVIDER &= 0xFFFF0000;         //SPIclk = Pclk/((HCLK_N+1)*2)
            SPI1_DIVIDER |= 0x00000002;
            SET_SPI1_SLAVE_MODE;          //SPI1工作在從機模式
           
            ENABLE_SPI1_INTERRUPT;        //使能SPI1中斷
            NVIC_ISER |= SPI1_INT;       
            Spi1Length(8);         //設置SPI1數據長度
            SPI1_GO_BUSY;                 //等待SPI1 RX0接收信號
        }  
        /****************************************
        *函數名稱:Spi1Length
        *輸    入:ucLength 數據長度
        *輸    出:無
        *功    能:設置SPI1數據長度
        ******************************************/
        VOID Spi1Length(UINT8 ucLength)
        {
             if(ucLength <= 0x20)
            {
                if((ucLength & 0x01) == 0)
                    SPI1_CNTRL &= ~(1<<3);
                else
                    SPI1_CNTRL |= (1<<3);
                if((ucLength & 0x02) == 0)
                    SPI1_CNTRL &= ~(1<<4);
                else
                    SPI1_CNTRL |= (1<<4);

                if((ucLength & 0x04) == 0)
                    SPI1_CNTRL &= ~(1<<5);
                else
                    SPI1_CNTRL |= (1<<5);

                if((ucLength & 0x08) == 0)
                    SPI1_CNTRL &= ~(1<<6);
                else
                    SPI1_CNTRL |= (1<<6);

                if((ucLength & 0x10) == 0)
                    SPI1_CNTRL &= ~(1<<7);
                else
                    SPI1_CNTRL |= (1<<7);
            }
        }
        /****************************************
        *函數名稱:PrintGetData
        *輸    入:無
        *輸    出:無
        *功    能:打印SPI0/1接收到的數據
        ******************************************/
        VOID PrintGetData(VOID)
        {
            DEBUGMSG("Slave Get Command = %X\n", g_unSpi1Rx0Data);
            DEBUGMSG("Master Get Feed Back Data = %X\n", g_unSpi0Rx0Data);
        }
        /*****************************************
        *函數名稱:SPI1_IRQHandler
        *輸    入:無
        *輸    出:無
        *功    能:SPI1中斷服務函數
        ******************************************/
        VOID SPI1_IRQHandler(VOID)
        {
            SPI1_CNTRL |= SPI_IF;       //清除中斷標志
            if(SPI1_RX0 == 0x55)
            {
                g_unSpi1Rx0Data = SPI1_RX0;
                SPI1_TX0 = 0x000000DA;
            }
            else
                SPI1_TX0 = 0x00000000;
            SPI1_GO_BUSY;                //等待SPI1 RX0接收信號
        }
        /****************************************
        *函數名稱:main
        *輸    入:無
        *輸    出:無
        *功    能:函數主體
        ******************************************/
        INT32 main(VOID)
        {
            PROTECT_REG                //ISP下載時保護FLASH存儲器
         (
           PWRCON |= XTL12M_EN;      //默認時鐘源為外部晶振
           while((CLKSTATUS & XTL12M_STB) == 0);   //等待12MHz時鐘穩定  
              CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M; //設置外部晶振為系統時鐘 
         ) 
         UartInit(12000000,9600);      //波特率設置為9600bps 
            Spi0MasterInit();        //SPI0初始化為主機模式
            Spi1SlaveInit();        //SPI1初始化為從機模式   
            while(1)
            {
                DEBUGMSG("Master will send 0x55 data to slave and receive 0xDA data\r\n");
                DEBUGMSG("Put AnyKey to Start Test\r\n");
                GetSlaveID();
                PrintGetData();
                printf("\r\n\r\n"); 
          Delayms(1000);
            }
        }

        關閉窗口
        和老头做爰很舒服,JK白丝裤袜开裆自慰喷水,在线天堂www在线...中文

          <address id="tnvjh"></address>
          <form id="tnvjh"><listing id="tnvjh"><meter id="tnvjh"></meter></listing></form>

            <form id="tnvjh"></form>

            <address id="tnvjh"><th id="tnvjh"></th></address>