Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16815
  • 博文数量: 5
  • 博客积分: 1415
  • 博客等级: 上尉
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-14 16:47
文章分类
文章存档

2008年(5)

我的朋友

分类: LINUX

2008-10-15 16:47:29

2410的I2S接口分析

以下内容是对2410的datasheet的理解.

overview

  • 支持iis bus data格式和HELP MSB-justified data格式
  • 支持dma方式访问内部的发送和接收FIFO
  • 支持同时发送和接收

block diagram

从图(见datasheet原文)上可以看出,iis模块与cpu一段是AHB总线,就是ADDR,DATA,CTRL和PCLK.和外设之间是:
  • SD:serial data,通过移位寄存器和FIFO内的数据进行转换,从后文看应该是发送接收各一,SDI和SDO
  • SCLK:就是位时钟了
  • LRCK:区分左右声道
  • HELP CDCLK

传输模式

  1. normal transfer
    通过接收FIFO和发送FIFO的ready标志进行读写
  2. dma
    由dma控制器访问FIFO
  3. transmit and receive mode
    发送和接收可以同时进行.

audio serial interface format

iis bus format

串行数据以二进制补码传输,MSB在前.MSB在前的好处是不需要理会传输各方的字长,具体的解释如下:

The MSB is transmitted first because the transmitter and receiver may have different word lengths. The transmitter does not have to know how many bits the receiver can handle, nor does the receiver need to know how many bits are being transmitted.

When the system word length is greater than the transmitter word length, the word is truncated (least significant data bits are set to '0') for data transmission. If the receiver gets more bits than its word length, the bits after the LSB are ignored. On the other hand, if the receiver gets fewer bits than its word length, the missing bits are set to zero internally. And therefore, the MSB has a fixed position, whereas the position of the LSB depends on the word length. The transmitter sends the MSB of the next word at one clock period whenever the IISLRCK is changed.

注意上文的红色部分,这也是此格式相异与另一种格式的唯一区别:下一个直接的MSB是在距LRCK改变后的一个时钟后开始传输,也就是说LRCK改变后还会传输一位的前一数据的LSB.

msb(left) justified

如前文所述,与iis bus format的区别就是LRCK改变后立即发送下一个直接的MSB,而不是再传输一位.

采样频率和主时钟

ALERT! 这节没大懂,尤其是里面256fs,384fs这些,skip

NEW 看完后文后补充:

fs意思是采样频率(sampling frequency),其他几个概念还是不明确ALERT! :

  • master clock frequency: 265/384fs
  • serial bit clock frequency: 16/32/48fs
  • serial data bit per channel: 8/16

iis LRCK仿佛就是采样频率,因为它的一个周期就传输采样的一次左声道和右声道的数据.但是这个频率又是怎么得到的呢HELP ?

寄存器

寄存器的地址0x55000000开始的,终于明白了代码里面的地址部分写的0x55XX原来是2410的i2s寄存器的物理地址.

HELP 有个不明白的地方,datasheet上说了有两个64字节的fifo(16bitX32),但是只有一个读fifo数据的寄存器,怎么选择当前操作的fifo呢?

2410的dma控制器

overview

4通道的dma控制器,支持4种数据传输方式(即系统总线的设备和外设总线的设备的2x2组合)

DMA操作可以有3种启动方式:

  1. software
  2. 内部设备的requests
  3. external request pins

dma request sources

每个dma通道可以使用的source都不一样,其中ch2我比较感兴趣,它支持以下源:
  1. I2SSDO
  2. I2SSDI
  3. SDI
  4. Timer
  5. USB device EP3

dma operations

dma使用了3态的有限状态机:
  • 状态1: 等待dma请求
  • 状态2: dma_ack置位,从寄存器中读取CURR_TC
  • 状态3: 传输数据,又分两种情况
    • single service mode: 只传输一次,然后清除dma_ack,如果CURR_TC被减为0,置位INT_REQ
    • whole service mode: 传输CURR_TC次,然后清除dma_ack,置位INT_REQ

dma registers

与实际传输的字节数相关的变量:
  • TC: 传输的count值
  • DSZ: data size(byte, half word, word)
  • TSZ: 一次原子传输的siez(1,4)
所以实际传输的字节数=DSZ*TSZ*TC.

源或目的地址在传输中都可以设置为递增或固定的(比如对io端口访问的时候).

有3种external dma request/acknowledge protocol,代表了源为xdreq时不同的时序:

  • single service demand
  • single service handshake
  • whole service handshake
这部份iis的dma不用关心,因为它不是外围的源.
阅读(1279) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~