野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13961|回复: 2

LCD与SPI FLASH结合就不行了

[复制链接]
发表于 2014-12-18 07:36:48 | 显示全部楼层 |阅读模式
LCD与SPI FLASH结合就不行了,我想把SPI FLASH写入和读出数据显示在开发板LCD上,结果几条带汉字的printf语句打叹号
LCD什么也不显示,去掉两个带汉字的printf语句后,LCD可正常显示,我迷 LCD显示和串口有什么关系,说是与串口有关,为什么printf打印英文语句没问题呢?
说与汉字显示有关,但最后两句带汉字的printf语句不用删LCD也能正常工作呢?

#include "bsp_usart1.h"
#include "bsp_spi_flash.h"
#include "bsp_ili9341_lcd.h"
#include "math.h"
typedef enum { FAILED = 0, PASSED = !FAILED} TestStatus;
/* 获取缓冲区的长度 */
#define TxBufferSize1   (countof(TxBuffer1) - 1)
#define RxBufferSize1   (countof(TxBuffer1) - 1)
#define countof(a)      (sizeof(a) / sizeof(*(a)))
#define  BufferSize (countof(Tx_Buffer)-1)
#define  FLASH_WriteAddress     0x00000
#define  FLASH_ReadAddress      FLASH_WriteAddress
#define  FLASH_SectorToErase    FLASH_WriteAddress
//#define  sFLASH_ID              0xEF3015     //W25X16
#define  sFLASH_ID              0xEF4015  //W25Q16
     
/* 发送缓冲区初始化 */


uint8_t Tx_Buffer[]={12,13,14,15,16,185,186,187,188,199};
uint8_t Rx_Buffer[BufferSize];
uint8_t n;
__IO uint32_t DeviceID = 0;
__IO uint32_t FlashID = 0;
__IO TestStatus TransferStatus1 = FAILED;
// 函数原型声明
void Delay(__IO uint32_t nCount);
TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength);

int main(void)
{  
/* 配置串口1为:115200 8-N-1 */
USART1_Config();
SPI_FLASH_Init();
LCD_Init();
               //printf("\r\n 这是一个2M串行flash(W25Q16)实验 \r\n");

/* 2M串行flash W25Q16初始化 */

LCD_Clear(0, 0, 240, 320, BACKGROUND);
LCD_DispStr(10, 10, (uint8_t *)"This is a flash test program", RED);
/* Get SPI Flash Device ID */
DeviceID = SPI_FLASH_ReadDeviceID();

Delay( 200 );

/* Get SPI Flash ID */
FlashID = SPI_FLASH_ReadID();

printf("\r\n FlashID is 0x%X,  Manufacturer Device ID is 0x%X\r\n", FlashID, DeviceID);

/* Check the SPI Flash ID */
if (FlashID == sFLASH_ID)  /* #define  sFLASH_ID  0xEF3015 */
{
//  printf("\r\n 检测到华邦串行flash W25Q16 !\r\n");
  
  /* Erase SPI FLASH Sector to write on */
  SPI_FLASH_SectorErase(FLASH_SectorToErase);   
  for( n=0; n<10; n++ )
   {
    LCD_DispStr(10, 40, (uint8_t *)"WRITE ", RED);
    LCD_DisNum(100, 60, n, WHITE);
    LCD_DisNum(100, 80, Tx_Buffer[n], RED);
   
    Lcd_Delay(0x6FFF00);
   }
  /* 将发送缓冲区的数据写到flash中 */
  SPI_FLASH_BufferWrite(Tx_Buffer, FLASH_WriteAddress, BufferSize);
  //printf("\r\n 写入的数据为:%s \r\t", Tx_Buffer);
  
  /* 将刚刚写入的数据读出来放到接收缓冲区中 */
  SPI_FLASH_BufferRead(Rx_Buffer, FLASH_ReadAddress, BufferSize);
  //printf("\r\n 读出的数据为:%s \r\n", Tx_Buffer);
  
  /* 检查写入的数据与读出的数据是否相等 */
  TransferStatus1 = Buffercmp(Tx_Buffer, Rx_Buffer, BufferSize);
  
  if( PASSED == TransferStatus1 )
  {   
  //printf("\r\n 2M串行flash(W25Q16)测试成功!\n\r");
   for( n=0; n<10; n++ )
   {
    LCD_DisNum(100, 100, Rx_Buffer[n], RED);
   
    Lcd_Delay(0xAFFF00);
   }
  }
  else
  {        
  printf("\r\n 2M串行flash(W25Q16)测试失败!\n\r");
  }
}// if (FlashID == sFLASH_ID)
else
{   
  printf("\r\n 获取不到 W25Q16 ID!\n\r");
}

SPI_Flash_PowerDown();  
while(1);  
}
/*
* 函数名:Buffercmp
* 描述  :比较两个缓冲区中的数据是否相等
* 输入  :-pBuffer1     src缓冲区指针
*         -pBuffer2     dst缓冲区指针
*         -BufferLength 缓冲区长度
* 输出  :无
* 返回  :-PASSED pBuffer1 等于   pBuffer2
*         -FAILED pBuffer1 不同于 pBuffer2
*/
TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength)
{
  while(BufferLength--)
  {
    if(*pBuffer1 != *pBuffer2)
    {
      return FAILED;
    }
    pBuffer1++;
    pBuffer2++;
  }
  return PASSED;
}
void Delay(__IO uint32_t nCount)
{
  for(; nCount != 0; nCount--);
}

回复

使用道具 举报

发表于 2014-12-18 08:58:15 | 显示全部楼层
初始化时,要先初始化液晶,再初始化串口
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-18 19:57:02 | 显示全部楼层
本帖最后由 11kxmx 于 2014-12-18 20:10 编辑
flyleaf 发表于 2014-12-18 08:58
初始化时,要先初始化液晶,再初始化串口


真的好奇怪呀,问题部分解决了,但最后一个语句printf("\r\n 2M串行flash(W25Q16)测试成功!\n\r")还是不能加上,加上后仍是白屏, 不知为什么?
另外,我的程序是比较写入和读出相等了才送往液晶屏,但液晶屏显示的最后一个数并不正确,199变成了088
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 20:31 , Processed in 0.025623 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表