新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > LPC ARM使用SPI總線控制8個LED燈

        LPC ARM使用SPI總線控制8個LED燈

        作者: 時間:2016-11-11 來源:網絡 收藏
        下面給出一個LPC ARM7通過SPI總線控制8路流水等的實例,讓大家對SPI總線傳輸、發送數據有一個清晰的了解。

        電路圖如下:

        本文引用地址:http://www.104case.com/article/201611/316724.htm

        開發板通過SPI總線控制74HC595驅動8盞LED燈
        程序清單如下:
        #include "config.h"
        #define SPI_CS (1 << 16) // P0.16口為片選腳
        #define CE_Low() (IO0CLR |= SPI_CS) // 選中從器件
        #define CE_High() (IO0SET |= SPI_CS)
        /* 流水燈花樣,低電平點亮,注意調用時候用了取反操作 */
        const uint32 LED_TBL[] =
        {
        0x00, 0xFF, // 全部熄滅后,再全部點亮
        0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, // 依次逐個點亮
        0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, // 依次逐個疊加
        0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, // 依次逐個遞減
        0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81, // 兩個靠攏后分開
        0x81, 0xC3, 0xE7, 0xFF, 0xFF, 0xE7, 0xC3, 0x81 // 從兩邊疊加后遞減
        };
        /***********************************************************
        ** 函數名稱: Delay
        ** 函數功能: 長軟件延時
        ** 入口參數: dly 延時參數,值越大,延時越久
        ** 出口參數: 無
        ************************************************************/
        void Delay(uint32 dly)
        {
        uint32 i = 0;
        for (; dly > 0; dly--)
        for (i = 0; i < 50000; i++);
        }
        /**********************************************************
        ** 函數名稱: SPIInit
        ** 功能說明: 初始化LPC2300系列ARM的SPI引腳及寄存器
        ** 入口參數: 無
        ** 出口參數: 無
        ************************************************************/
        void SPIInit(void)
        {
        /* 初始化SPI引腳 */
        PINSEL0 = 0;
        IO0DIR |= SPI_CS; // 設置SPI的片選引腳
        PINSEL0 |= 0xc0000000; // 設置P0.15腳為SCK腳
        PINSEL1 = (0x03 << 2) | (0x03 << 4); // 設置P0.17、P0.18引腳為SPI引腳

        /* 初始化SPI寄存器 */
        S0SPCCR = 0x48; // 設置SPI時鐘分頻
        S0SPCR = (0 << 2) | // SPI控制器每次傳輸發送和接收8位數據。
        (0 << 3) | // CPHA = 0, 數據在SCK 的第一個時鐘沿采樣
        (0 << 4) | // CPOL = 0, SCK 為高有效
        (1 << 5) | // MSTR = 1, SPI 處于主模式
        (1 << 6) | // LSBF = 0, SPI 數據傳輸MSB (位7)在先
        (0 << 7); // SPIE = 0, SPI 中斷被禁止
        }
        /************************************************************************
        ** 函數名稱: SPISndByte
        ** 函數功能: 通過硬件SPI接口發送一個字節
        ** 入口參數: data
        ** 出口參數: 無
        ************************************************************************/
        void SPISndByte(uint8 data)
        {
        uint32 temp = 0;
        CE_Low();
        S0SPDR = data;
        while (0 == (S0SPSR & 0x80)); // 等待SPIF置位,即等待數據發送完畢
        temp = S0SPSR; // 通過讀S0SPSR,清除SPIF標志
        CE_High();
        }
        /**************************************************************
        ** 函數名稱: main
        ** 函數功能: 用SPI驅動流水燈顯示
        ** 入口參數: 無
        ** 出口參數: 返回0則表明程序出錯
        ** 調試說明: 需用杜邦線將P0.15~P0.18分別與SCLK、/CS、MISO、MOSI短接。
        ***************************************************************/
        int main(void)
        {
        uint32 i = 0;

        SPIInit();

        while (1)
        {
        for (i = 0; i < 42; i++)
        {
        Delay(20);
        SPISndByte(LED_TBL[i]);
        }
        }
        return (0);
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 扬州市| 集贤县| 澄江县| 赤峰市| 手游| 临湘市| 北宁市| 五指山市| 珠海市| 义乌市| 焦作市| 潼关县| 台北市| 河曲县| 武城县| 徐闻县| 武威市| 兰西县| 拜泉县| 灵丘县| 格尔木市| 徐闻县| 福鼎市| 东丰县| 寻甸| 马山县| 同江市| 张掖市| 中牟县| 台安县| 永宁县| 寿光市| 武清区| 肥城市| 泾川县| 固安县| 三门县| 公安县| 象州县| 伊通| 正镶白旗|