在用 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); |