打印
[ZLG-MCU]

LM3S811 SSI 巨蛋疼的一个问题!!!

[复制链接]
2665|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ngyg12|  楼主 | 2010-11-20 20:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在用 LM3S811 上用 SSI 的时候出现了让小弟很难理解的一个问题!

背景:
       在 LM3S811 上操作 SD 卡和 TFT , SD 卡使用的是 FATFS 文件系统.

欲实现的功能:

       从SD 卡的汉字库中读取汉字字模显示在 TFT 屏上.

问题内容:

     1:SD 卡使用的是 SPI (SSI) 驱动, 当单独的使用文件系统的读取数据函  (ReadONEFile的时候, 一切正常!(所谓的正常的意思:从 SD 卡中读取指定偏移量的数据
          和使用 WINHEX 中显示的数据一样,这便表明, SSI 初始化和使用都是成功的)
     2:TFT 显示汉字的功能是这样的:在显示函数(LCD_PutString)中用上面 1 中提到的文件系统的读取数据函数, 于是问题来了!只要是从这个LCD_PutString函数中使用ReadONEFile SSI 就初始化不了了, 一直死在硬件中断中!这两个程序在 STM32F103 上都是通过了的,到了这边就出现了这样的问题!郁闷啊!
    希望有经验的大虾们能帮帮小弟!!!

PS:(涉及到的函数)

/*-----------------------------------------------------------
** 函数名称: LCD_PutString
** 功    能: 在 TFT 上显示文字
** 参    数: x: 显示文字的 x 坐标
             y: 显示文字的 y 坐标
         sData:  欲显示的文字字符串
        fColor: 字体颜色
        bColor: 文字背景颜色
** 返 回 值:
** 备    注:  
------------------------------------------------------------*/
void LCD_PutString(unsigned short x, unsigned short y,
                   unsigned char *sData,
     unsigned int fColor, unsigned int bColor)
{
/*const */unsigned char *pData;
   unsigned char  ASCIIarray[12] = {0};  
   unsigned long  ptr = 0;
          unsigned char  HZarray[24] = {0};
int  i;
while(*sData != '\0')
  {
     
/* 判断编码是 ASCII 还是汉字编码 */
  if( *sData < 0x80)
  {
    /* 判断换行符 */
    if(*sData == '\r')
    {
     x  = 0;
   y += ASCCIIHIGH;
   sData += 2;
   continue;   
    }
    /* 获取 ASCII 的字模数据 */
    pData = (unsigned char *)(&ASCII_6x12[(*sData - 32) * 12]);
    for(i = 0;i < 12;i ++)
    {
      ASCIIarray[i] = *pData ++;   
    }
    /* 判断剩下的空间是否能显示一个 ASCII 码 */
    if((TFTMAX_LENGTH - x) <= LASTASCCIIWIDTH)
    {
     x  = 0;
   y += ASCCIIHIGH;
   
    }
    LCD_PutChar6x12(x, y, ASCIIarray, fColor, bColor);
    x += ASCCIIWIDTH;
    sData ++;
  }
  else
  {
    ptr  = (*sData++ - 0xa1) * 0x5e;
    ptr += *sData - 0xa1;
    ptr *= 24;
    /* 读取指定汉字的字模 */
    ReadONEFile(HZKname, HZarray, 24, ptr);
    /* 判断剩下的空间是否能显示一个汉字 */
    if((TFTMAX_LENGTH - x) <= LASTHZWIDTH)
    {
      /* 换行 */
     x  = 0;
   y += HZHIGH;
   
    }
    /* 显示该汉字 */
    DisplayONEHZ_GB12x12(x, y, HZarray, fColor, bColor);
    /* 加一个汉字的宽度 */
    x += HZWIDTH;
    sData ++;
  }
}
}
/*-----------------------------------------------------------
** 函数名称: ReadONEFile
** 功    能: 读取一个文件的任意偏移量数据.
** 参    数:
            filename: 欲操作的文件名称(需包含文件路径)
    DataBuffer: 读取数据的缓存区.
   ByteToWrite: 欲读取数据的字节数.
       readptr: 欲读取数据的偏移量.
** 返 回 值:
** 备    注:
** 创建日期: 2010 - 09 - 25
------------------------------------------------------------*/
FRESULT ReadONEFile( const char *filename, unsigned char *DataBuffer,
                     unsigned int ByteToRead, DWORD readptr)
{
  
//static FATFS fs_sd;    // Work area (file system object) for logical drive
static FIL  fsrc;        // file objects
    FRESULT  res;         // FatFs function common result code
       UINT  ByteRead;
  f_mount(0, &fs_sd);
  
  res = f_open(&fsrc, filename, (FA_OPEN_EXISTING | FA_READ));
  if(res)
  {
   DealWith_res(res);
  }
  /* 设定数据偏移量 */
  res = f_lseek(&fsrc,readptr);
  if(res)
  {
    DealWith_res(res);
  }
  res = f_read(&fsrc, DataBuffer, ByteToRead, &ByteRead);
  if(res)
  {
    DealWith_res(res);
  }
  if(ByteRead < ByteToRead)
  {
   
res =  FILE_FINISH;
  
  }
  
  f_close(&fsrc);
  
  f_mount(0,NULL);
   
  return (res);
}

//
    // 初始化 SPI 的设置.
    //
    SysCtlPeripheralEnable(_SSI_GPIO_);        // 使能 SSI 管脚
    SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI); // 使能 SSI 模块
   
    //
    // 设置 SSI 的 CS 管脚为输出,由程序控制。
    //
    GPIOPinTypeGPIOOutput(SSI_GPIO_BASE,_SSI_CS_PIN_);
   
   //
   // 对 SSI 配置前需禁止其功能.
   //
   SSIDisable(SSI_BASE);
   
   //
   // 配置相应管脚为相应功能  
   //
   GPIOPinTypeSSI(GPIO_PORTA_BASE,_SSI_GPIO_PIN_);
  
   SSIConfigSetExpClk(SSI_BASE,
                      SysCtlClockGet(),
                      SSI_FRF_MOTO_MODE_0, // 极性 0,相位 0
                      SSI_MODE_MASTER,     // 主机模式
                      9600,8);           //8 位有效位
                                                   
   //
   // 使能 SSI
   //
   SSIEnable(SSI_BASE);

相关帖子

沙发
ngyg12|  楼主 | 2010-11-20 20:13 | 只看该作者
在 LCD_PutString() 函数中调用ReadONEFile函数就会卡死, 单独使用 ReadONEFile 就是正常的, 好奇怪...

使用特权

评论回复
板凳
杜_U_ME| | 2010-11-21 16:27 | 只看该作者
路过,帮你顶下

使用特权

评论回复
地板
ngyg12|  楼主 | 2010-11-21 17:19 | 只看该作者
3# 杜_U_ME

谢谢...

使用特权

评论回复
5
明天我还来| | 2010-11-29 17:11 | 只看该作者
蛋疼都能发上来啊?我看搂主还是淡定吧哈哈。

使用特权

评论回复
6
ngyg12|  楼主 | 2010-12-1 08:45 | 只看该作者
5# 明天我还来
呵呵

使用特权

评论回复
7
diny| | 2010-12-2 16:40 | 只看该作者
问题解决了吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:菜鸟一个望大家多多指教...

5

主题

553

帖子

5

粉丝