硬字库读取问题,SPI通信

周墨 2014-02-11 11:21:22
第一次用到硬字库,根据数据手册编写SPI通信程序。用示波器测试,可以确定读取汉字的指令和地址已经成功发送到字库芯片,而且有32字模数据也返回了。但是我却没有接收到,或者说SPIBUF中没有接收到。
希望有相关经验的大神指导,万分感谢!一下是关键代码:


void comm(uint8 data)
{
SPI1BUF=data;
while (!IFS0bits.SPI1IF);
IFS0bits.SPI1IF=0;
}


uint8 RecvByte()
{
uint8 mrdata=0;
mrdata = SPI1BUF;
while(SPI1STATbits.SPIRBF);
return mrdata;
}


//汉字的地址计算
uint32 GB2312_Addr(uint16 hanzi)
{
uint8 MSB,LSB;
uint32 Address=0;
uint32 BaseAdd=0;

MSB = (hanzi>>8);
LSB = (hanzi);

if(MSB >=0xA4 && MSB <= 0Xa8 && LSB >=0xA1)
Address = BaseAdd;
else if(MSB >=0xA1 && MSB <= 0Xa9 && LSB >=0xA1)
Address =( (MSB - 0xA1) * 94 + (LSB - 0xA1))*32+ BaseAdd;
else if(MSB >=0xB0 && MSB <= 0xF7 && LSB >=0xA1)
Address = ((MSB - 0xB0) * 94 + (LSB - 0xA1)+846)*32+BaseAdd;

return Address;
}


void Read_word (uint32 address)
{
uint8 msb,ssb,lsb; //分别用于存储地址的高、中、低字节
uint8 RT_data=0x03;
uint8 count=0;
uint8 index = 0;

lsb=address;
ssb=address>>8;
msb=address>>16;

cs=0;
nop(); //片选拉低
//delay(10); //稍作延时
comm(RT_data); //一般读取的命令,表明这是一般读取模式
comm(msb); //传送地址的高字节
comm(ssb); //传送地址的中间字节
comm(lsb); //传送地址的低字节



for(count=0;count<32;count++)
{
//comm(1);
word_data[count] = RecvByte();
//word_data[count]=temp_data;
}
cs=1;
}


int main(void)
{
uint32 address=0;
uint16 hanzi='好'; //测试读取一个‘好’字
SPI2BUF=0; //BUF2清零

init_spi2_IO();
cs=1;
init_SPI2();

SPI2STATbits.SPIEN = 1;

address=GB2312_Addr(hanzi);

Read_word(address);

while(1);
return 0;
}
...全文
299 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
of123 2014-02-14
  • 打赏
  • 举报
回复
uint8 RecvByte()
{
    uint8 mrdata=0; 
    SPI1BUF = 0x00;    
    while(SPI1STATbits.SPIRBF);  
    mrdata = SPI1BUF; 
    return mrdata;
}
周墨 2014-02-14
  • 打赏
  • 举报
回复
引用 6 楼 zhxianbin 的回复:
pbuf[i] = (uint8_t)spi_send_rcv(0xFF); 注意这行
我试过,也确实是这样,要接收的同时要发送虚拟数据过去,才能产生时钟。用示波器测试MISO引脚有数据返回,但就是没接收到!
zhxianbin 2014-02-13
  • 打赏
  • 举报
回复
pbuf[i] = (uint8_t)spi_send_rcv(0xFF); 注意这行
zhxianbin 2014-02-13
  • 打赏
  • 举报
回复

        //CS变为低
 	GPIO_ResetBits(GT21L16_GPIO, GT21L16_PIN_CS);

	//1个字节的命令字(0x03) 和3个字节的地址
	spi_send_rcv(GT21L16_CMD_READ);
	spi_send_rcv((address&0xFF0000)>>16);
	spi_send_rcv((address&0xFF00)>>8 );
	spi_send_rcv(address&0x0000FF );

	//读数据
	for ( i=0; i<len; ++i )
	{
		pbuf[i] = (uint8_t)spi_send_rcv(0xFF);//send dummy byte for the clocks!
	}

	//CS变为高,结束本次操作
	GPIO_SetBits(GT21L16_GPIO, GT21L16_PIN_CS);
周墨 2014-02-12
  • 打赏
  • 举报
回复
这个地方我也按照你说的试过,while(SPI1STATbits.SPIRBF);的意思是判断接收缓冲区是否已经读完。
mangoalx 2014-02-12
  • 打赏
  • 举报
回复
SPI 由主控设备提供时钟,通常在读数据时也需要发空数据(否则没有时钟信号)。参考单片机手册和范例程序是不是这样
色郎中 2014-02-12
  • 打赏
  • 举报
回复
参考下我的一个例子 http://blog.csdn.net/wanyeye/article/details/3876753
mangoalx 2014-02-12
  • 打赏
  • 举报
回复
uint8 RecvByte() { uint8 mrdata=0; mrdata = SPI1BUF; while(SPI1STATbits.SPIRBF); return mrdata; } 看起来你先读的数据,然后才等标志。应该把 mrdata = SPI1BUF 放到 while 语句后面吧?
本设计是以STM32VET6作为主控制器,外围辅以3.5寸TFT液晶、SD卡、VS1003(VS1003数据手册)音频解码器、spi flash、AL422(AL422数据手册)FIFO Memory、XPT2046(XPT2046数据手册)触摸IC、pl2303(pl2303数据手册)USB转串口IC等,实现了一个功能丰富的小设备。本设计中使用的TFT作为显示单元,屏是3.5寸的分辨率320*480,控制IC为ILI9481,通过STM32的FSMC总线与系统相连,写屏速度还是挺快的,如果有片大RAM做显存,通过DMA总线操作的话就更快了,不过之前没考虑到啊!使用SD卡作为数据存储,这里充分利用片子的优势,用得是SDIO接口,比SPI快多了,能够支持FAT16/32文件系统。 本设计实现的主要功能描述: 1.音乐播放,使用vs1003音频解码芯片,能支持大部分主流的音频格式,可以上一曲、下一曲,可以快退快进,播放界面是模仿了千千静听中的“炫紫神话”皮肤,界面的实现完全是通过软件绘制的方式,没有贴任何图片,为了实现那些层次阴影的效果,综合运用了颜色渐变,颜色叠加的方法,特别是那个圆形按钮花了不少时间,大家看看是不是还有点立体感呢,在界面中也显示了频谱,不过频谱数据是从vs1003中读取的,好像不怎么准确的,不过也将就了。(注:EQ、LRC功能没实现,所以那两个按钮也是无用的) 2.图片播放部分主要是一直正点原子的代码,能支持BMP、JPEG图片的显示。在选中播放功能后显示进入文件浏览界面,界面中只会显示需要播放的文件格式与文件夹,比如进入图片播放的文件浏览界面中,就只会显示可以打开的图片与文件夹,其他功能也是一样。另外在文件浏览中,可以通过上下左右滑动触摸来翻页的。 3.电子书阅读功能,可以打开常见的文本文件,如.txt、.lrc、.c、.h,系统中集成了GB2312字库,有12*12、16*16、24*24三种大小,它们被存储在一片SPI FLASH中,型号是EN25F16。 4.照相机功能,这个没有实现完成,可以将摄像头的数据取来并实时显示在TFT屏上,但不能保存照片,可以支持ov7670和ov7725两种摄像头,摄像头是通过AL422 FIFO与MCU接口的,图像数据先进FIFO中,然后MCU根据场中断开始提取数据,可以刷个4~5帧吧,具体没测,由于现在手头上没摄像头了,没有上这部份功能的图,但程序中是有这部份功能的。 5.拼图游戏这部份是移植的网络中的代码,不过实现起来也不难,比较容易理解,游戏分3个难度等级,3*3、4*4、5*5,也没太多可说的,看图吧。 6.时间显示部分实现了一个指针式的时钟,这里的表盘是图片了,因为软件画的话比较麻烦,指针的绘制参考了ucgui中画多边形的代码,并且使用了透明效果,指针遮挡部位下面的文字图案依然能看到的。温度采集用得是片内的线性温度传感器,温度偏高了,不过件上预留了DS18B20的位置,暂未使用。 7.触摸画板功能可以实时显示在触屏上画下的线条,这个功能比较简单了,不过也有待完善。 8.文件浏览跟前面提到的进入播放功能后打开的浏览界面是一样的,只是这里不分文件格式了,任何格式的文件都会显示,方便查看。 9.系统设定部分提供了一些设置系统参数的接口,如日期时间设定、触摸校正,还有一些设置没完成。 10.USB设备功能,STM32自带了一个USB2.0设备接口,可方便的实现一些USB传输功能,本系统通过USB与计算机连接,可以枚举成USB mass storage和HID Mouse两种设备,mass storage功能实际就是将系统枚举为一个U盘了,可以方便通过计算机管理系统SD卡中的文件,速度不很快,200~300KB左右,板子背部有个LED可表示USB的读写状态,HID Mouse就是将系统枚举为一个鼠标了,通过在触屏上滑动,点击控制计算机上鼠标指针的行为,不过由于电阻屏的特点,我也没仔细写代码,使用效果不好,不过USB通信这块是完善的,另外本设计中还加入了一片pl2303 USB转口芯片,该芯片传出串口与STM32的UART1相连,可方便的通过串口下载程序,或打印log调试信息等。 在做这个毕业设计中,件的设计当时考虑了很多,其实还预留了一些功能,比如MIC、IR,不过暂时未使用,电源部分,将TFT供电与其他部分的供电隔开了,是各自单独用了一片稳压IC的,而且各部分的供电是可以通过左侧边的几个排阵控制的,这里还引出几个未用的引脚供试验用,另外为了充分利用这块板,TFT所有的引脚通过左上边的一个座子引出了,可以单独去使用这个TFT,由于供电是隔开的,所以不必担心其他部分的干扰,也不会给板上的STM32供电。

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧