mengmi 发表于 2010-9-28 20:34:52

关于单片机地址的问题……

马老师,能不能解释一下这几句话“在实验板上,利用MCU 自己的读写时序特征,可以很方便地读写LD 芯片的
寄存器。在现有连接中,MCU 的A14 连接到LD 芯片的CSB*,而MCU 的A8 连接到
LD 芯片的A0。
并行方式的读写函数为:
#define LD_INDEX_PORT (*((volatile uint8 xdata*)(0x8100)))
#define LD_DATA_PORT (*((volatile uint8 xdata*)(0x8000)))
void LD_WriteReg( uint8 ulAddr, uint8 ucVal )
{
LD_INDEX_PORT = ulAddr;
LD_DATA_PORT = ucVal;
}
uint8 LD_ReadReg( uint8 ulAddr )
{
LD_INDEX_PORT = ulAddr;
return (uint8)LD_DATA_PORT;
}
8100: 第14 位=1 第8 位=1
8000: 第14 位=1 第8 位=0
于是MCU 向LD 芯片的CSB*和A0 发出信号,配合此时的数据线,可以对LD
芯片的寄存器进行读写操作,十分方便。第15 位=1 是为了避开低端地址。”?

machao 发表于 2010-9-28 21:19:48

你到底什么地方不明白?关键的地方。
把你明白的地方说明。
如果什么都不明白,要从基础学起。

这个是51的系统吧。

系统对这个LD芯片采用RAM操作的并行方式来读写LD的寄存器(你需要知道LD芯片的操作时序)

“第15 位=1 是为了避开低端地址。”?

估计这个系统外挂了RAM,RAM的地址不超过32K,在地址空间的低端,LD的地址定义在32K以上的空间,这样对RAM操作和对LD操作不会冲突。

mengmi 发表于 2010-10-2 17:46:21

回复【1楼】machao
-----------------------------------------------------------------------

#define LD_INDEX_PORT (*((volatile uint8 xdata*)(0x8100)))
#define LD_DATA_PORT (*((volatile uint8 xdata*)(0x8000)))
这两句话不明白,0x8100,0x8000这两个地址是怎么来的?

machao 发表于 2010-10-8 23:30:24

这个需要看硬件电路的设计。
好象你没有什么基础的,还是从基本的开始学习的好。

mengmi 发表于 2010-10-11 12:00:05

我的基础有点差,我主要是学AVR的,但是我确实想搞懂这个芯片……

mengmi 发表于 2010-10-11 17:03:24

点击此处下载 ourdev_588956J1WE0G.pdf(文件大小:369K) (原文件名:LD3320开发手册.pdf)
点击此处下载 ourdev_588957LAG4L0.pdf(文件大小:109K) (原文件名:LD3320测试板原理图.pdf)

machao 发表于 2010-10-11 19:40:08

楼上的,抱歉。没有基础学AVR是没有用的,也学不好。

mengmi 发表于 2010-10-12 12:05:43

马老师,请不要回避我的问题,基础我会自己搞(没人教),现在不也是向您学习请教问题嘛……
我就是那几个地址搞不懂,还有这个
#define MP3_BEIJING_START        0x0000;
#define MP3_BEIJING_SIZE        0x0868;
#define MP3_SHANGHAI_START        0x0C00;
#define MP3_SHANGHAI_SIZE        0x0ab0;
#define MP3_TIANJIN_START        0x1800;
#define MP3_TIANJIN_SIZE        0x0a20;
#define MP3_CHONGQING_START        0x2400;
#define MP3_CHONGQING_SIZE        0x0990;
#define MP3_NIHAO_START        0x3000;
#define MP3_NIHAO_SIZE        0x1170;
也不太懂,麻烦回答一下……

machao 发表于 2010-10-12 18:03:58

其实我已经告诉你了。

#define LD_INDEX_PORT (*((volatile uint8 xdata*)(0x8100)))
#define LD_DATA_PORT (*((volatile uint8 xdata*)(0x8000)))

这个是LD的读写端口地址(估计LD是个大容量的存储器芯片),这个地址是硬件设计时决定的。你如果要真正的知道,就需要学习计算机接口方面的硬件基础,还要了解LD芯片的使用(看手册),这样就能看懂硬件设计,也就明白0X8000,0X8100的意义。

下面估计是这个LD中存放的MP3语音数据,前面表示这段MP3数据在LD中存放的起始地址,后面表示表示这段数据的长度。

#define MP3_BEIJING_START 0x0000;
#define MP3_BEIJING_SIZE 0x0868;
#define MP3_SHANGHAI_START 0x0C00;
#define MP3_SHANGHAI_SIZE 0x0ab0;
#define MP3_TIANJIN_START 0x1800;
#define MP3_TIANJIN_SIZE 0x0a20;
#define MP3_CHONGQING_START 0x2400;
#define MP3_CHONGQING_SIZE 0x0990;
#define MP3_NIHAO_START 0x3000;
#define MP3_NIHAO_SIZE 0x1170;


比如:
#define MP3_SHANGHAI_START 0x0C00;
#define MP3_SHANGHAI_SIZE 0x0ab0;

表示SHANGHAI的这段MP3数据(可能就是播报上海的语音)在LD中从0X0C00处开始存放,长度为0X0AB0字节。

我不是回避你的问题,因为根据你的基础,我解释了你也不一定能明白和理解。

mengmi 发表于 2010-10-14 12:08:13

谢谢马老师的回答,我还想问一下,MP3语音数据是怎样写入内存的?相应的关键字是怎样写入的?

machao 发表于 2010-10-14 12:29:18

1。需要了解MP3文件的格式
2。在PC上用UltraEdit打开该MP3文件(十六进制方式),跳过文件头,仅将语音部分的编码数据取出,并记录下字节数,作为十六进制数据备用。
3。将所有的MP3文件中取出的语音部分数据整理合并,然后写到LD中对应的地址中。

注意,在制作原始的MP3文件时,所有MP3文件的码率和格式应该是统一的。

这样处理,播放系统不需要什么文件系统,MCU直接到对应的地址读数据,然后扔给MP3解码器就可以了。

以上反映出嵌入式系统的剪裁特性,经过剪裁,你的系统就是一个“专用”的,特殊MP3播放器。

你要付咨询费的,两瓶五粮液:)

mengmi 发表于 2010-10-14 22:35:32

马老师果然是我们的好老师!!!./emotion/em105.gif./emotion/em102.gif

mengmi 发表于 2010-10-17 18:56:56

马老师,对我们这些自学者有没有什么建议?现在我是一点头绪也没有……
页: [1]
查看完整版本: 关于单片机地址的问题……