使用OMAP-L138通过SPI控制两款屏幕:
屏幕1:像素160*128,16比特;
屏幕2:像素320*240,16比特;
均使用EDMA3写入显存数据,屏幕1数据量较小(160*128*2=40960字节),使用A Sync模式,屏幕2数据量较大(320*240*2=153600字节),使用AB Sync模式。按照表格中配置DMA参数,屏幕1可以正常显示,屏幕2却不能正常显示且程序卡死。请问我的参数是不是配置的不正确,或者除了Param这几个寄存器,使用AB Sync模式还需要配置哪些寄存器,请高手指点,不胜感激。
屏幕1 |
屏幕2 |
param.opt =EDMA_TCC(channel); param.src = dma_phyaddr; param.a_b_cnt = (20480 << 16) | 2; edma_write_slot(channel, ¶m); edma_write_slot(dummy_slot, ¶m); |
param.opt =EDMA_TCC(channel) | SYNCDIM; param.src = dma_phyaddr; param.a_b_cnt = (240 << 16) | 2; edma_write_slot(channel, ¶m); edma_write_slot(dummy_slot, ¶m); |
再次附上屏幕2的参数配置:
#define ACNT 2
#define BCNT 240
#define CCNT 320
#define BCNTRLD 0
#define LINK 0xFFFF
#define DSTBIDX 0
#define SRCBIDX 2
#define DSTCIDX 0
#define SRCCIDX (ACNT * BCNT)
Haha Fan:
我看手册spruh77a第18.3.4.2 Brusting Peripherals一章举得例子,和我的情况完全相同,但是按照其配置方法,仍然会卡死,也不能正常显示。
Haha Fan:
回复 Haha Fan:
把param按照下面的参数配置:
param.a_b_cnt = (2 << 16) | 2; param.src_dst_bidx = 2; param.link_bcntrld = 0x0000FFFF; param.src_dst_cidx = 4; param.ccnt = 38400;
屏幕被横竖分成四个相同的区域,每个区域显示一副完整的图像,读取Framebuffer缓冲区,和原图片相同,好像DMA每隔四个像素取一个值传输。
Tony Tang:
回复 Haha Fan:
SPI接口就一个数据寄存器,不能支持AB同步,因为AB同步是一个事件往SPI搬A*B个数据,SPI接口里没地方放啊,需要等移位寄存器往外移出一个数才可以接收下一个数。
Haha Fan:
回复 Tony Tang:
多谢您的答复,从示波器上看,发送的数据索引是0、3、7、…,确实是隔四个送出一个。而且手册上写着138的DMA不支持FIFO,那么像我这种情况应该如何操作?我要是把BCNT设置成1,那么CCNT就是76800,超过了65535的限制,那么CCNT设置为38400,屏幕被上下等分,每块均显示图片的上半部分;我想在TCINTEN回调函数中重新更新Param,继续显示下半副图像,但是屏幕却滚动的很厉害;我看手册上提到Chaining,本次Param耗尽后可以执行另一个Channel的操作,请问这个Channel可以和本Channel相同吗?请问您那里有例程吗?
Haha Fan:
回复 Tony Tang:
谢谢,是您给我很大启发,是我想太多了。
/* Channel Options Parameters (OPT) Field Descriptions of EDMA3 */ param.opt =#ifdef SPI_DMA_TCINT_ENABLE TCINTEN |#endif EDMA_TCC(channel) /* | SYNCDIM | FWID(3) | SAM | DAM | STATIC | ITCINTEN | TCCHEN | ITCCHEN | TCCMODE */;
param.src = dma_phyaddr; param.dst = spi_phyaddr;
#define ACNT 2#define BCNT 240#define CCNT 320
param.a_b_cnt = (BCNT << 16) | ACNT; param.src_dst_bidx = ACNT; param.link_bcntrld = (BCNT << 16) | 0xFFFF; param.src_dst_cidx = ACNT; param.ccnt = CCNT;
这样配置就可以正常显示了。