查看: 2840|回复: 0

【赚周年币】技术帖Week2-Day7——LPC824 Breakout之14、SPI NOKIA5110

[复制链接]
  • TA的每日心情
    开心
    11 小时前
  • 签到天数: 3713 天

    连续签到: 39 天

    [LV.Master]伴坛终老

    发表于 2017-1-14 22:50:49 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 toofree 于 2017-1-19 03:21 编辑

            【赚周年币】技术帖Week2-Day7——LPC824 Breakout之14、SPI NOKIA5110

            本打算在完成SPI测试之后,就改造一下 NOKIA5110 LCD成硬件SPI接口,但是很不幸,失败了。苦于一直没有找到解决办法,而发愁。在测试了“【赚周年币】技术帖Week2-Day3——LPC824 Lite之十、SPI FLASH测试”之后,找到点感觉,今晚测试终获成功。

            下面我们以之前贴子,“【赚周年币】技术帖Week2-Day1——LPC824 Breakout之八、SPI测试”之后打包上传程序为模板,进行本实验。贴子地址。【赚周年币】技术帖Week2-Day1——LPC824 Breakout之八、SPI测试https://www.cirmall.com/bbs/forum.php?mod=viewthread&tid=62824&fromuid=17147
             傲游截图20170114224653.jpg

            复制工程“Example_SPI0M_SPI1S”工程文件和源代码文件,改名为“Example_SPI0M_LCD5110”。并且复制之前的“\user_bsp\src\nokia5110.c”和“\user_bsp\inc\nokia5110.h”,改名为“SPI_nokia5110.c” 、“SPI_nokia5110.h” 。修改后的工程如下图。
             傲游截图20170114224859.jpg

            并对“SPI_nokia5110.c” 、“SPI_nokia5110.h”两个文件做适当修改。
            “SPI_nokia5110.c” 文件58行之前内容有更改后如下:
    1. //#include <Arduino.h>
    2. #include "SPI_nokia5110.h"
    3. #include "ascii.h"
    4. #include "disp_code.h"

    5. volatile unsigned int TCount0 = 0;              //定时计数器0
    6. volatile unsigned int TCount1 = 0;              //定时计数器1
    7. volatile unsigned int TCount2 = 0;              //定时计数器2
    8. //volatile bool Second_Flag = FALSE;           //一秒时间到标志位
    9. //volatile bool Base_Flag = FALSE;             //基准海拔采集标志位
    10. //volatile bool Read_Flag = FALSE;             //读数据时间到标志位
    11. volatile unsigned char Second_Flag = FALSE;           //一秒时间到标志位
    12. volatile unsigned char Base_Flag = FALSE;             //基准海拔采集标志位
    13. volatile unsigned char Read_Flag = FALSE;             //读数据时间到标志位

    14. /*********************************************************************************************************
    15. ** 函数名称: SendRecv_Byte
    16. ** 函数功能:一次传输内部的单字节帧发送与接收
    17. ** 输入参数: 数据线上发送出的数据
    18. ** 输出参数: 数据线上接收到的数据
    19. ** 返 回 值:无
    20. *********************************************************************************************************/
    21. uint8_t Send_Byte (uint8_t ucData)
    22. {
    23.     while (!(LPC_SPI0->STAT & STAT_TXRDY));                               /* 等待发送准备就绪             */
    24.     LPC_SPI0->TXDATCTL = TXDATCTL_FSIZE(7) | TXDATCTL_EOF | ucData;       /* 8 位,帧结束                 */   
    25.    
    26.     while (!(LPC_SPI0->STAT & STAT_RXRDY));                               /* 等待接收数据完成             */
    27.     ucData = LPC_SPI0->RXDAT;                                                   /* 接收数据                     */
    28.    
    29.     return ucData;
    30. }

    31. //发送一字节数据,显示内容的话,一列8位对应一字节,上面对应字节低位
    32. static void SPI_SendByte (uint8_t dat)
    33. {
    34.   uint8_t i;
    35.   
    36.   /*
    37.   for (i = 0; i < 8; i ++)
    38.   {
    39.     NOKIA5110_clk_clear();
    40.     if (dat & 0x80)
    41.     {
    42.       NOKIA5110_din_set();
    43.     }
    44.     else
    45.     {
    46.       NOKIA5110_din_clear();
    47.     }
    48.     dat = dat << 1;
    49.     NOKIA5110_clk_set();
    50.   }
    51.   */

    52.         Send_Byte (dat);

    53. }
    复制代码
    Home_Init()函数,把SPI接口初始化内容加上,更改后为下:
    1. void Home_Init()
    2. {
    3.   //Serial.begin(9600);                           //串口定义波特率函数

    4.   GPIOSetDir(PORT0, LCD_RST, 1);
    5.   GPIOSetDir(PORT0, LCD_DC, 1);
    6. //  GPIOSetDir(PORT0, LCD_CS, 1);
    7. //  GPIOSetDir(PORT0, LCD_DIN, 1);
    8. //  GPIOSetDir(PORT0, LCD_CLK, 1);
    9.         
    10. // SWM settings for SPI0 (master):
    11. // P0.24 = SPI0_SCK  (requires external connection with P0.28)
    12. // P0.25 = SPI0_MISO (requires external connection with P0.19)
    13. // P0.26 = SPI0_MOSI (requires external connection with P0.4)
    14. // P0.15 = SPI0_SSEL (requires external connection with P0.0)

    15.   // Enable clocks to SPI0/1, SWM (see lpc8xx_syscon.h)
    16.   LPC_SYSCON->SYSAHBCLKCTRL |= (SPI0 | SWM);

    17.   // Configure the SWM (see utilities_lib and lpc8xx_swm.h)
    18.         ConfigSWM(SPI0_SSEL0, P0_24);
    19.         ConfigSWM(SPI0_MOSI, P0_27);
    20.   ConfigSWM(SPI0_SCK, P0_28);
    21.   //ConfigSWM(SPI0_MISO, P0_21);  

    22.   // Configure SPI0 as master, SPI1 as slave
    23.   // Bit rate = 15  m.b.p.s
    24.   // SPI mode 0 (CPOL = 0 CPHA = 0)
    25.   // 8 data bits
    26.   //

    27.   // Setup the SPIs ...
    28.   // Give both SPIs a reset  (see lpc8xx_syscon.h)
    29.   LPC_SYSCON->PRESETCTRL &= (SPI0_RST_N);
    30.   LPC_SYSCON->PRESETCTRL |= ~(SPI0_RST_N);

    31.   // Configure the SPI master's clock divider, slave's value meaningless. (value written to DIV divides by value+1)
    32.   // SCK = SPI_PCLK divided by 2
    33.   LPC_SPI0->DIV = (2-1);

    34.   // Configure the CFG registers:
    35.   // Enable=true, master, no LSB first, CPHA=0, CPOL=0, no loop-back, SSEL active low
    36.   LPC_SPI0->CFG = CFG_ENABLE | CFG_MASTER;
    37.         // Enable=true, master, no LSB first, CPHA=1, CPOL=1, no loop-back, SSEL active low
    38.   //LPC_SPI0->CFG = CFG_ENABLE | CFG_MASTER | CFG_CPHA | CFG_CPOL;

    39.   // Configure the master SPI delay register (DLY), slave's value meaningless.
    40.   // Pre-delay = 0 clocks, post-delay = 0 clocks, frame-delay = 0 clocks, transfer-delay = 0 clocks
    41.   //LPC_SPI0->DLY = 0x0000;
    42.         // Pre-delay = 0 clocks, post-delay = 0 clocks, frame-delay = 0 clocks, transfer-delay = 0 clocks
    43.   LPC_SPI0->DLY = 0;        //0x2222;

    44.   // Configure the SPI control registers
    45.   // Master: End-of-frame true, LEN = 8 bits. Slave: LEN = 8 bits
    46.   LPC_SPI0->TXCTL = CTL_EOF | CTL_LEN(8);
    47.         
    48. }
    复制代码
    SPI_nokia5110.h”文件62行之前内容更改后如下:
    1. //#include <avr/pgmspace.h>
    2. #include <stdint.h>
    3. #include "lpc8xx_gpio.h"
    4. #include "lpc8xx_syscon.h"

    5. #include "lpc8xx_spi.h"
    6. #include "lpc8xx_swm.h"
    7. #include "utilities.h"

    8. #ifndef TRUE
    9.         #define TRUE                  1
    10. #endif

    11. #ifndef FALSE
    12.         #define FALSE                 0
    13. #endif

    14. #ifndef HIGH
    15.         #define HIGH                  1
    16. #endif

    17. #ifndef LOW
    18.         #define LOW                 0
    19. #endif

    20. extern volatile unsigned int TCount0;              //定时计数器0
    21. extern volatile unsigned int TCount1;              //定时计数器1
    22. extern volatile unsigned int TCount2;              //定时计数器2
    23. //volatile bool Second_Flag = FALSE;           //一秒时间到标志位
    24. //volatile bool Base_Flag = FALSE;             //基准海拔采集标志位
    25. //volatile bool Read_Flag = FALSE;             //读数据时间到标志位
    26. extern volatile unsigned char Second_Flag;           //一秒时间到标志位
    27. extern volatile unsigned char Base_Flag;             //基准海拔采集标志位
    28. extern volatile unsigned char Read_Flag;             //读数据时间到标志位

    29. #define PORT0                        0

    30. /*************************** HAL define ***************************/
    31. //#define   LCD_CS           24
    32. #define   LCD_RST   25
    33. #define   LCD_DC    26
    34. //#define   LCD_DIN   27
    35. //#define   LCD_CLK   28

    36. #define NOKIA5110_CMD                   0
    37. #define NOKIA5110_DATA                  1
    38.                  
    39. #define LCD5110_WIDTH                   84
    40. #define LCD5110_HEIGHT                  5

    41. #define NOKIA5110_reset_clear() GPIOSetBitValue(PORT0, LCD_RST, LOW)  //
    42. #define NOKIA5110_reset_set()   GPIOSetBitValue(PORT0, LCD_RST, HIGH)

    43. #define NOKIA5110_sel_data()    GPIOSetBitValue(PORT0, LCD_DC, HIGH)  //
    44. #define NOKIA5110_sel_cmd()     GPIOSetBitValue(PORT0, LCD_DC, LOW)  //

    45. //#define NOKIA5110_cs_set()      GPIOSetBitValue(PORT0, LCD_CS, HIGH)  //
    46. //#define NOKIA5110_cs_clear()    GPIOSetBitValue(PORT0, LCD_CS, LOW)  //
    47. //#define NOKIA5110_din_set()     GPIOSetBitValue(PORT0, LCD_DIN, HIGH)  //
    48. //#define NOKIA5110_din_clear()   GPIOSetBitValue(PORT0, LCD_DIN, LOW)  //
    49. //#define NOKIA5110_clk_set()     GPIOSetBitValue(PORT0, LCD_CLK, HIGH)  //
    50. //#define NOKIA5110_clk_clear()   GPIOSetBitValue(PORT0, LCD_CLK, LOW)  //
    复制代码
    之前为什么不行呢,有几个细节没有注意到,看手册不够仔细,被库函数参数误导了。后来参考了,“LPC824 Lite之十、SPI FLASH测试”程序中"w25x32.c"程序中参数,并结合LPC824用户手册205到227页相关内容,终于成功。
            NOKIA5110 LCD的控制器PCD8544数据手册中,SPI时序如下图:
             lcd5110.jpg

            库函数“lpc8xx_spi.c”文件中,TXDATCTL相关位宏定义如下:
           lpc8xx_spi.jpg

            而"w25x32.c"文件中的,宏定义有所不同,见下图:
             w25x32.jpg

           可以看到,一个是(n-1),一个是(s),到底谁是对的呢,现在知道肯定其它一个是错的。为了寻根究底,我们看看数据手册“UM10800.pdf”又是怎么解释的呢。
           UM10800.pdf (3.2 MB, 下载次数: 16)

    评分

    参与人数 2 +99 收起 理由
    EEboard爱板网 + 84 3周发帖养成记 奖励
    loveeeboard + 15

    查看全部评分

    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-3-19 11:07 , Processed in 0.147988 second(s), 22 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.