发新帖我要提问
123
返回列表
打印

44b0平台驱动TFT液晶,写显示缓冲区时遇到问题

[复制链接]
楼主: milkyway1888
手机看帖
扫描二维码
随时随地手机跟帖
41
wangkj| | 2011-5-26 19:51 | 只看该作者 回帖奖励 |倒序浏览
很多arm的gpio和spi软件能调不用跳线。

使用特权

评论回复
42
milkyway1888|  楼主 | 2011-5-27 09:10 | 只看该作者
40# 英雄无敌六

谢谢兄弟。
不过我用的是中断方式处理SPI。

使用特权

评论回复
43
milkyway1888|  楼主 | 2011-5-27 09:11 | 只看该作者
41# wangkj
请教一下怎么通过软件把SPI调整为普通的GPIO?

使用特权

评论回复
44
wangkj| | 2011-5-27 09:36 | 只看该作者
别用中断;判断发完换成循环。
spi->gpio通过管脚功能配置实现,不是所有的arm都支持,看看器件手册。
复杂问题先简化,搞定了再恢复原有功能。

使用特权

评论回复
45
milkyway1888|  楼主 | 2011-5-27 10:21 | 只看该作者
44# wangkj

44b0手册里操作SIO好像只提到使用中断和DMA方式,怎么用查询方式?

To program the SIO modules, follow these basic steps:
1. Configure the I/O pins at port (SIOTXD, SIOCLK, SIORXD).
2. Set SIOCON register to properly configure the serial I/O module.
3. For interrupt generation, set the serial I/O interrupt enable bit and refer the interrupt controller to 1.
4. If you want to transmit data to the serial buffer, write data to SIODAT.
5. For receiving/transmitting, set SIOCON[3] to 1 to start the shift operation.
6. When the shift operation (transmit/receive) is completed, the SIO interrupt is requested and SIODAT has the
received data or dummy data.
7. go to step 4

使用特权

评论回复
46
wangkj| | 2011-5-27 10:35 | 只看该作者
中断,dma都不用,用延时。delay_ms(1);

使用特权

评论回复
47
milkyway1888|  楼主 | 2011-5-27 16:25 | 只看该作者
本帖最后由 milkyway1888 于 2011-5-27 16:30 编辑

void EI_spi_vSendByte(uchar ucData)
{
    int i;
    rSIODAT = ucData;
    rSIOCON |= (1 << 3);
for (i = 0; i < 5000; i++);
}

谢谢wangkj兄的解答。我把SPI写的函数做了如上修改,问题依旧。不使用缓冲区刷全屏没问题,一旦用缓冲区还是不能刷全屏。

使用特权

评论回复
48
wangkj| | 2011-5-27 17:42 | 只看该作者
那肯定是缓冲区相关内存管理方面的函数有问题。
循环值最后可以试着减少,或者最后用dma硬件传送。

使用特权

评论回复
49
milkyway1888|  楼主 | 2011-5-27 17:58 | 只看该作者
循环减小到1200次,或者是在循环里delay 2ms是可以刷全屏的。
缓冲区也就涉及了malloc函数和指针操作啊。
搞不懂问题究竟出在哪儿

使用特权

评论回复
50
wangkj| | 2011-5-27 21:36 | 只看该作者
都用静态数组。别用指针。

使用特权

评论回复
51
英雄无敌六| | 2011-5-27 23:11 | 只看该作者
还没搞定?
这里有错误:
EG_lcd_uiMemerySize = (EM_lcd_XSIZE0 * EM_lcd_YSIZE0 * EM_lcd_PIXELSIZE0) >> 3;
EG_lcd_pucCurrentDispMem = (uchar *)EA_pvMalloc(EG_lcd_uiMemerySize);   
第一句会可能少分配一个INT.
改为:
EG_lcd_uiMemerySize = (EM_lcd_XSIZE0 * EM_lcd_YSIZE0 * EM_lcd_PIXELSIZE0+7) >> 3;

使用特权

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

本版积分规则