|
发表于 2010-5-31 14:59:49
|
显示全部楼层
最近在探索用时间触发的方式实现基于vs1003的mp3,但遇到困难,感觉这类任务不太容易用时间触发的方式实现。
基于vs1003的mp3通常是用下面的方法来实现的:
res = f_open(&fsrc, "test.mp3", FA_OPEN_EXISTING | FA_READ);
if (res) goto error;
while(1)
{
res = f_read(fp, buffer, 512, &read_counts); // 约2ms
if(res || br == 0)
break;
while(p < 512 ) // 320kbps的mp3播放512字节数据12.5ms
{
if( VS1003_PIN & _BV(VS1003_DREQ) )
{
for(i = 0; i < 32; i++)
VS1003_WriteData(buffer;
}
}
}
error:
...
上面的代码执行有如下特点:
1、AVR单片机spi设置为fosc/2的频率,用fatfs读取512字节大约耗时2ms;
2、320Kbps的mp3,512字节的数据需要512B / 40KB/s = 12.5ms,这意味着在12.5ms内至少需要送512B的数据给VS1003。
3、VS1003在DREQ为高时可以连续接收32B的数据,但下一次接收数据需要等待DREQ再次变高,这个时间数据手册上没有给出,
实际测试(没有数字示波器,极不好测试,可能测得不准)等待时间会根据内部数据RAM中有的数据量不同而不同,时快时慢。
4、VS1003播放32字节数据需要0.8ms,如果每0.8ms送32个字节,那么系统时标0.8ms,但读512字节数据需要2ms,
1个时标处理不完,感觉这样的问题用时间触发的方式不好解决。 |
|