|
发表于 2012-12-24 09:09:02
|
显示全部楼层
本帖最后由 hpdell 于 2012-12-24 11:08 编辑
Excellence 发表于 2012-12-24 08:34
没成功。
后来,我先把字库放MCU FLASH里,然后写到SPI FLASH
.
我这两天终于搞成功了,通过串口做字库,我制作了16*16、24*24、32*32的字库都以成功,不过串口软件还是使用楼主提供的,楼主提供的串口软件我的杀毒软件提示病毒,在开启串口软件前先关闭杀毒软件。。。
波特率设置为38400
pc吧HzLib。txt 发送给单片机,单片机接收识别为字符,需要吧字符转化为16进制数,我的转换函数:
/*------------------------------------------------------
写一个字节的数据
addr是写入数据的地址
dat 是写入的数据
测试OK
注:在写入之前必须先擦除对应的扇区或擦除这个芯片
------------------------------------------------------*/
void SPIx_WriteBytes(SPI_TypeDef* SPIx, uint32_t nSector,u8 dat)
{
SPIx_WriteEnable(SPIx);
SPI1_CS_L;
SPIx_WriteByte(SPIx, W25Q_PageProgram);
SPIx_WriteByte(SPIx, (u8)(nSector >> 16));
SPIx_WriteByte(SPIx, (u8)(nSector >> 8));
SPIx_WriteByte(SPIx, (u8) nSector);
SPIx_WriteByte(SPIx, dat);
SPI1_CS_H;
SPIx_WaitBusy(SPIx);
//SPIx_WriteDisable(SPIx);
}
unsigned char change(unsigned char*buf) //将接收到的字符转换成16进制数
{
unsigned char out;
unsigned char temp0,temp1;
if(buf[0] <= '9')
temp0 = buf[0] - 48;
else if(buf[0] <= 'F')
temp0 = buf[0] - 55;
else if(buf[0] <= 'f')
temp0 = buf[0] - 87;
if(buf[1] <= '9')
temp1 = buf[1] - 48;
else if(buf[1] <= 'F')
temp1 = buf[1] - 55;
else if(buf[1] <= 'f')
temp1 = buf[1] - 87;
out = (temp0<<4) | temp1;
return out;
}
u8 RxBuff[2];
extern u32 SPI_W25QxxHzLibBassAddr;
u8 RxData=0,datcnt=0;
//串口接收中断函数
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) // 接收中断有效 ;
{
RxBuff[datcnt] = USART_ReceiveData(USART1); // 返回USARTx最近接收到的数据 ;
datcnt++;
if(datcnt == 2)
{
RxData = change(RxBuff); //将字符转换成16进制数
SPIx_WriteBytes(SPI1, SPI_W25QxxHzLibBassAddr,RxData); //汉字库以16进制数据写入
SPI_W25QxxHzLibBassAddr++;
datcnt = 0;
//USARTx_PutChar(USART1, RxData);
}
USART_ClearITPendingBit(USART1, USART_IT_RXNE); // 清除USART1的接收中断
}
} |
|