TA的每日心情 | 开心 11 小时前 |
---|
签到天数: 3713 天 连续签到: 39 天 [LV.Master]伴坛终老
|
本帖最后由 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
复制工程“Example_SPI0M_SPI1S”工程文件和源代码文件,改名为“Example_SPI0M_LCD5110”。并且复制之前的“\user_bsp\src\nokia5110.c”和“\user_bsp\inc\nokia5110.h”,改名为“SPI_nokia5110.c” 、“SPI_nokia5110.h” 。修改后的工程如下图。
并对“SPI_nokia5110.c” 、“SPI_nokia5110.h”两个文件做适当修改。
“SPI_nokia5110.c” 文件58行之前内容有更改后如下:- //#include <Arduino.h>
- #include "SPI_nokia5110.h"
- #include "ascii.h"
- #include "disp_code.h"
- volatile unsigned int TCount0 = 0; //定时计数器0
- volatile unsigned int TCount1 = 0; //定时计数器1
- volatile unsigned int TCount2 = 0; //定时计数器2
- //volatile bool Second_Flag = FALSE; //一秒时间到标志位
- //volatile bool Base_Flag = FALSE; //基准海拔采集标志位
- //volatile bool Read_Flag = FALSE; //读数据时间到标志位
- volatile unsigned char Second_Flag = FALSE; //一秒时间到标志位
- volatile unsigned char Base_Flag = FALSE; //基准海拔采集标志位
- volatile unsigned char Read_Flag = FALSE; //读数据时间到标志位
- /*********************************************************************************************************
- ** 函数名称: SendRecv_Byte
- ** 函数功能:一次传输内部的单字节帧发送与接收
- ** 输入参数: 数据线上发送出的数据
- ** 输出参数: 数据线上接收到的数据
- ** 返 回 值:无
- *********************************************************************************************************/
- uint8_t Send_Byte (uint8_t ucData)
- {
- while (!(LPC_SPI0->STAT & STAT_TXRDY)); /* 等待发送准备就绪 */
- LPC_SPI0->TXDATCTL = TXDATCTL_FSIZE(7) | TXDATCTL_EOF | ucData; /* 8 位,帧结束 */
-
- while (!(LPC_SPI0->STAT & STAT_RXRDY)); /* 等待接收数据完成 */
- ucData = LPC_SPI0->RXDAT; /* 接收数据 */
-
- return ucData;
- }
- //发送一字节数据,显示内容的话,一列8位对应一字节,上面对应字节低位
- static void SPI_SendByte (uint8_t dat)
- {
- uint8_t i;
-
- /*
- for (i = 0; i < 8; i ++)
- {
- NOKIA5110_clk_clear();
- if (dat & 0x80)
- {
- NOKIA5110_din_set();
- }
- else
- {
- NOKIA5110_din_clear();
- }
- dat = dat << 1;
- NOKIA5110_clk_set();
- }
- */
- Send_Byte (dat);
- }
复制代码 Home_Init()函数,把SPI接口初始化内容加上,更改后为下:- void Home_Init()
- {
- //Serial.begin(9600); //串口定义波特率函数
- GPIOSetDir(PORT0, LCD_RST, 1);
- GPIOSetDir(PORT0, LCD_DC, 1);
- // GPIOSetDir(PORT0, LCD_CS, 1);
- // GPIOSetDir(PORT0, LCD_DIN, 1);
- // GPIOSetDir(PORT0, LCD_CLK, 1);
-
- // SWM settings for SPI0 (master):
- // P0.24 = SPI0_SCK (requires external connection with P0.28)
- // P0.25 = SPI0_MISO (requires external connection with P0.19)
- // P0.26 = SPI0_MOSI (requires external connection with P0.4)
- // P0.15 = SPI0_SSEL (requires external connection with P0.0)
- // Enable clocks to SPI0/1, SWM (see lpc8xx_syscon.h)
- LPC_SYSCON->SYSAHBCLKCTRL |= (SPI0 | SWM);
- // Configure the SWM (see utilities_lib and lpc8xx_swm.h)
- ConfigSWM(SPI0_SSEL0, P0_24);
- ConfigSWM(SPI0_MOSI, P0_27);
- ConfigSWM(SPI0_SCK, P0_28);
- //ConfigSWM(SPI0_MISO, P0_21);
- // Configure SPI0 as master, SPI1 as slave
- // Bit rate = 15 m.b.p.s
- // SPI mode 0 (CPOL = 0 CPHA = 0)
- // 8 data bits
- //
- // Setup the SPIs ...
- // Give both SPIs a reset (see lpc8xx_syscon.h)
- LPC_SYSCON->PRESETCTRL &= (SPI0_RST_N);
- LPC_SYSCON->PRESETCTRL |= ~(SPI0_RST_N);
- // Configure the SPI master's clock divider, slave's value meaningless. (value written to DIV divides by value+1)
- // SCK = SPI_PCLK divided by 2
- LPC_SPI0->DIV = (2-1);
- // Configure the CFG registers:
- // Enable=true, master, no LSB first, CPHA=0, CPOL=0, no loop-back, SSEL active low
- LPC_SPI0->CFG = CFG_ENABLE | CFG_MASTER;
- // Enable=true, master, no LSB first, CPHA=1, CPOL=1, no loop-back, SSEL active low
- //LPC_SPI0->CFG = CFG_ENABLE | CFG_MASTER | CFG_CPHA | CFG_CPOL;
- // Configure the master SPI delay register (DLY), slave's value meaningless.
- // Pre-delay = 0 clocks, post-delay = 0 clocks, frame-delay = 0 clocks, transfer-delay = 0 clocks
- //LPC_SPI0->DLY = 0x0000;
- // Pre-delay = 0 clocks, post-delay = 0 clocks, frame-delay = 0 clocks, transfer-delay = 0 clocks
- LPC_SPI0->DLY = 0; //0x2222;
- // Configure the SPI control registers
- // Master: End-of-frame true, LEN = 8 bits. Slave: LEN = 8 bits
- LPC_SPI0->TXCTL = CTL_EOF | CTL_LEN(8);
-
- }
复制代码 “SPI_nokia5110.h”文件62行之前内容更改后如下:- //#include <avr/pgmspace.h>
- #include <stdint.h>
- #include "lpc8xx_gpio.h"
- #include "lpc8xx_syscon.h"
- #include "lpc8xx_spi.h"
- #include "lpc8xx_swm.h"
- #include "utilities.h"
- #ifndef TRUE
- #define TRUE 1
- #endif
- #ifndef FALSE
- #define FALSE 0
- #endif
- #ifndef HIGH
- #define HIGH 1
- #endif
- #ifndef LOW
- #define LOW 0
- #endif
- extern volatile unsigned int TCount0; //定时计数器0
- extern volatile unsigned int TCount1; //定时计数器1
- extern volatile unsigned int TCount2; //定时计数器2
- //volatile bool Second_Flag = FALSE; //一秒时间到标志位
- //volatile bool Base_Flag = FALSE; //基准海拔采集标志位
- //volatile bool Read_Flag = FALSE; //读数据时间到标志位
- extern volatile unsigned char Second_Flag; //一秒时间到标志位
- extern volatile unsigned char Base_Flag; //基准海拔采集标志位
- extern volatile unsigned char Read_Flag; //读数据时间到标志位
- #define PORT0 0
- /*************************** HAL define ***************************/
- //#define LCD_CS 24
- #define LCD_RST 25
- #define LCD_DC 26
- //#define LCD_DIN 27
- //#define LCD_CLK 28
- #define NOKIA5110_CMD 0
- #define NOKIA5110_DATA 1
-
- #define LCD5110_WIDTH 84
- #define LCD5110_HEIGHT 5
- #define NOKIA5110_reset_clear() GPIOSetBitValue(PORT0, LCD_RST, LOW) //
- #define NOKIA5110_reset_set() GPIOSetBitValue(PORT0, LCD_RST, HIGH)
- #define NOKIA5110_sel_data() GPIOSetBitValue(PORT0, LCD_DC, HIGH) //
- #define NOKIA5110_sel_cmd() GPIOSetBitValue(PORT0, LCD_DC, LOW) //
- //#define NOKIA5110_cs_set() GPIOSetBitValue(PORT0, LCD_CS, HIGH) //
- //#define NOKIA5110_cs_clear() GPIOSetBitValue(PORT0, LCD_CS, LOW) //
- //#define NOKIA5110_din_set() GPIOSetBitValue(PORT0, LCD_DIN, HIGH) //
- //#define NOKIA5110_din_clear() GPIOSetBitValue(PORT0, LCD_DIN, LOW) //
- //#define NOKIA5110_clk_set() GPIOSetBitValue(PORT0, LCD_CLK, HIGH) //
- //#define NOKIA5110_clk_clear() GPIOSetBitValue(PORT0, LCD_CLK, LOW) //
复制代码 之前为什么不行呢,有几个细节没有注意到,看手册不够仔细,被库函数参数误导了。后来参考了,“LPC824 Lite之十、SPI FLASH测试”程序中"w25x32.c"程序中参数,并结合LPC824用户手册205到227页相关内容,终于成功。
NOKIA5110 LCD的控制器PCD8544数据手册中,SPI时序如下图:
库函数“lpc8xx_spi.c”文件中,TXDATCTL相关位宏定义如下:
而"w25x32.c"文件中的,宏定义有所不同,见下图:
可以看到,一个是(n-1),一个是(s),到底谁是对的呢,现在知道肯定其它一个是错的。为了寻根究底,我们看看数据手册“UM10800.pdf”又是怎么解释的呢。
UM10800.pdf
(3.2 MB, 下载次数: 16)
|
评分
-
查看全部评分
|