I2S音频总线学习(三)S3C2440的I2S控制器

I2S音频总线学习(三)S3C2440的I2S控制器

一、I2S控制器结构框图

S3C2440A的Inter-IC Sound (IIS)总线接口作为一个编解码接口连接外部8/16位立体声音频解码IC用于迷你碟机和可携式应用。IIS总线接口支持IIS总线数据格式和MSB-justified数据格式。该接口对FIFO的访问采用了DMA模式取代了中断。它可以在同一时间接收和发送数据。

图1 结构框图

  1. 总线接口,寄存器组和状态机(BRFC):总线接口逻辑和FIFO 访问由状态机控制。
  2. 5 位双预定标器(IPSR):一个预定标器用于IIS 总线接口的主时钟发生器,另外一个用作外部编解码时钟发生器。
  3. 64 位FIFO(TxFIFO 和RxFIFO):在发送数据传输时,数据写到TxFIFO;在接收数据传输时,从RxFIFO 读取数据。
  4. 主IISCLK 发生器(SCLKG):在主设备模式,串行位时钟是从主时钟生成。
  5. 通道发生器和状态机(CHNC):IISCLK 和iislrck 是由通道状态机生成并控制。
  6. 15 位移位寄存器(SFTR):在发送模式下并行数据移位成串行数据输出,在接收模式下串行数据输入移位成并行数据。

二、发送接收模式

1.通常传输

IIS 控制寄存器对于发送接收FIFO 有一个FIFO 准备标志位。当FIFO 准备发送数据时,如果FIFO 非空,FIFO 准备标志位置1。如果FIFO 为空,FIFO 准备标志位置0。当接收FIFO非满,对于接收FIFO 的FIFO 准备标志位置1。其指出FIFO 准备好接收数据。如果接收FIFO 为满,FIFO 准备标志置0。这些标志用于决定CPU 读写FIFO 的时间。用这种方法当CUP 在访问发送接收FIFO 时,串行数据能被发送和接收。

2.DMA 传输

在此模式下,发送或接收FIFO 对DMA 控制器是可访问的。在发送或接收模式下的DMA服务请求是由FIFO 准备标志自动执行。

3.发送和接收模式

在此模式下IIS 总线接口可以同时接收和发送数据。

三、音频串行接口格式

1.IIS 总线格式

IIS 总线有四线包括串行数据输入(IISDI),串行数据输出(IISDO),左右通道选择(IISLRCK)和串行位时钟(IISCLK)。生成IISLRCK 和IISCLK 的设备是主设备。串行数据以2 的补码发送,MSB(Most Significant Bit 最高位)先发。因为发送器和接收器可能有不同的字长,MSB(最高位)先发。发送器不必知道接收器可以处理多少位,接收器也不必知道会收到多少位。当系统字长大于发生器的字长,字为了数据发送而被截断(最低位被置0)。如果接收器接收大于其字长的位,在LSB(最低位)后的位被忽略。另外,如果接收器收到的位数小于其字长,缺少的位被置0。因此MSB 有一个固定的位置,而LSB 的位置取决于字长。只要IISLRCK 发送改变,发送器在一个时钟周期内发送下一个字的MSB。由发送器发送的串行数据可以和时钟信号的下降沿和上升沿同步。但是,串行数据必须在串行时钟信号的上升沿锁存到接收器。因此当同步上升沿的数据发送时有一些限制。左右通道选择线指出了正在发送的通道。IISLRCK 可以在串行时钟的下降沿或上升沿被改变,当时其不需要对称。在从设备,信号在串行时钟的下降沿或上升沿被锁存。在MSB 被发送,IISLRCK 线改变一个时钟周期。此允许发送器导出用于建立发送的串行数据同步时序。此外,其使能接收存储前一个字且为下一个字的接收清除输入。

2.MSB JUSTIFIED 格式

MSB JUSTIFIED 总线格式在结构上和IIS 总线格式。唯一和IIS 总线格式的区别,MSB JUSTIFIED 格式实现了只要IISLRCK 改变,发送器总是发送下一个字的MSB。

图2 IIS格式和MSB JUSTIFIED数据格式

四、IIS采集频率和主设备时钟

I2S主设备时钟频率可以通过采样频率来选择,这是因为I2S主设备时钟频率是由I2S分频器产生的(主设备时钟频率=PCLK/预分频器值),因此必须选择合适的预分频值和CODECLK的采样频率类型(256fs或384fs),才能获得合适的I2SLRCK频率(I2SLRCK频率=主设备时钟频率/CODECLK)。
串行位采用频率类型(16/32/48fs)可以通过配置信道的串行位数和CODECLK采样频率类型来完成(串行位时钟频率类型=CODECLK的采用类型/串行数据位数)。

五、IIS 总线接口特殊寄存器

I2S相关的寄存器包括I2S控制寄存器I2SCONI2S模式寄存器I2SMODI2S分频寄存器I2SPSRI2SFCON寄存器和FIFO寄存器。


1)I2SCON控制寄存器


I2SCON控制寄存器物理地址为0x55000000,可读/写,复位后值为0x100。寄存器各个比特位意义如下:

[8]左右声道标记,0=左声道,1=右声道;
[7]发送FIFO就绪标记,取0时表示没有就绪,取1时表示FIFO就绪;
[6]接收FIFO就绪标记,取0时表示没有就绪,取1时表示FIFO就绪;
[5]发送DMA请求使能,取0时请求禁止,取1时请求使能;
[4]接收DMA请求使能,取0时请求禁止,取1时请求使能;
[3]发送通道空闲命令,在空闲状态(暂停传输)时,I2SLRCK是不激活的,0表示I2SLRCK产生,1表示不产生;
[2]接收通道空闲命令,在空闲状态(暂停传输)时,I2SLRCK是不激活的,0表示I2SLRCK产生,1表示不产生;
[1]I2S预分频器使能,取0时预分频器禁止,取1时预分频器使能;
[0]I2S接口使能,取0I2S禁止,取1I2S使能。

2I2SMOD模式寄存器

I2SMOD模式寄存器物理地址为0x55000004,可读/写,复位后值为0x000。寄存器各个比特位意义如下:

[8]主从模式选择,取0时为主模式,取1时为从模式;
[7:6]发送/接收模式选择,00=无,01=接收模式,10=发送模式,11=发送/接收模式;
[5]左右通道优先级,取0时右通道高左通道低,取1时右通道低左通道高;
[4]串行接口格式,取0I2S兼容格式,取1MSB可调格式;
[3]每通道串行数据位,取08位,取116位;
[2]主时钟频率选择,取0时主时钟是256fs(采样频率),取1时为384fs
[1:0]串行位时钟频率选择,00=位时钟是16fs01=位时钟是32fs10=位时钟是48fs11=未定义。

3I2S分频寄存器I2SPSR

I2S分频寄存器物理地址为0x55000008,可读/写,复位后值为0x000。寄存器各个比特位意义如下:

[9:5]A预分频值,预分频器A的除因子,I2S总线接口主时钟=MCLK/A预分频因子;
[4:0]B预分频值,预分频器B的除因子,外部CODEC时钟=MCKL/B预分频因子。

4I2SFCON寄存器

I2SFCON寄存器物理地址为0x5500000C,可读/写,复位后值为0x000。寄存器各个比特位意义如下:

[15]发送FIFO访问模式选择,取0时工作于普通模式,取1时工作在DMA模式;
[14]接收FIFO访问模式选择,取0时工作于普通模式,取1时工作在DMA模式;
[13]控制发送FIFO使能,取1时使能,取0时禁止;
[12]控制接收FIFO使能,取1时使能,取0时禁止;
[11:6]发送端FIFO数据计数,计数值032
[5:0]接收端FIFO数据计数,计数值032

5FIFO寄存器I2SFIF

FIFO寄存器物理地址为0x55000010,可读/写,复位后值为0x000。寄存器各个比特位意义如下:I2S总线接口在发送/接收模式有两个64字节的FIFO,每个FIFO由宽16、深32的表组成,并且每个FIFO单元可以分别操作高字节或低字节。通过FIFO入口访问发送和接收FIFO,入口地址为0x55000010


  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
此用户手册描述的是星公司的 16/32 位精简指令集(RISC)微处理器 S3C2440A。星公司的 S3C2440A 为手持设备和普通应用提供了低功耗和高性能的小型芯片控制器的解决方案。为了降低整体系统成本,S3C2440A 还提供了以下丰富的内部设备。 S3C2440A 基于ARM920T 核心,0.13µm 的CMOS 标准宏单元和存储器单元。低功耗,简单,精致,且全静 态设计特别适合于对成本和功率敏感型的应用。它采用了新的总线架构如先进微控制总线构架(AMBA) 。 S3C2440A 的突出特点是其处理器核心,是一个由Advanced RISC Machines(ARM)公司设计的 16/32 位 ARM920T的RISC 处理器。ARM920T 实现了 MMU,AMBA 总线和哈佛结构高速缓冲体系结构。这一结构具有独 立的 16KB指令高速缓存和 16KB 数据高速缓存。每个都是由具有 8字长的行(line)组成。 通过提供一套完整的通用系统外设,S3C2440A减少整体系统成本和无需配置额外的组件。综合对芯片的功能 描述。 本手册将介绍 S3C2440A 集成的以下片上功能: ● 1.2V内核供电, 1.8V/2.5V/3.3V储存器供电, 3.3V外部I/O供电,具备16KB的指令缓存和16KB的数据缓存和MMU 的微处理器 ● 外部存储控制器(SDRAM 控制和片选逻辑) ● LCD 控制器(最大支持 4K 色 STN 和 256K 色 TFT)提供 1 通道 LCD 专用 DMA ● 4 通道 DMA 并有外部请求引脚 ● 3 通道 UART(IrDA1.0, 64 字节发送 FIFO 和 64 字节接收 FIFO) ● 2 通道 SPI ● 1 通道 IIC 总线接口(支持多主机) ● 1 通道 IIS 总线音频编码器接口 ● AC’97 编解码器接口 ● 兼容 SD 主接口协议 1.0 版和 MMC 卡协议 2.11 兼容版 ● 2 通道 USB 主机/1 通道 USB 设备(1.1 版) ● 4 通道 PWM 定时器和 1 通道内部定时器/看门狗定时器 ● 8 通道 10 位 ADC 和触摸屏接口 ● 具有日历功能的 RTC ● 摄像头接口(最大支持 4096×4096 像素输入;2048×2048 像素输入支持缩放) ● 130 个通用 I/O 口和 24 通道外部中断源 ● 具有普通,慢速,空闲和掉电模式 ● 具有 PLL 片上时钟发生器
要通过ESP32-S3读取SD卡中的音频文件,并通过I2S输出,请按照以下步骤操作: 1. 首先,您需要将SD卡连接到ESP32-S3。您可以使用SPI协议连接SD卡,或使用ESP32-S3的SDMMC主机控制器。请确保正确配置SD卡相关引脚和协议。 2. 接下来,您需要使用ESP-IDF中的I2S驱动程序将音频数据从SD卡读取并通过I2S输出。您可以使用i2s_write_expand()函数来将16位PCM音频数据转换为I2S数据格式,并使用i2s_write()函数将数据发送到I2S总线。 3. 在使用I2S驱动程序之前,请确保正确配置I2S接口。您可以使用i2s_driver_install()函数安装I2S驱动程序,并使用i2s_set_pin()函数设置I2S引脚。请参考ESP-IDF文档以获取更多详细信息。 4. 最后,您需要编写代码来打开音频文件并从SD卡读取数据。您可以使用ESP-IDF中的文件系统API来访问SD卡上的文件,例如fopen()、fread()和fclose()函数。请确保正确处理文件读取错误和文件结束条件。 下面是一个示例代码片段,用于从SD卡中读取16位PCM音频文件,并将其发送到I2S总线: ```c #include "esp_partition.h" #include "esp_vfs_fat.h" #include "driver/i2s.h" #define I2S_NUM 0 #define I2S_SAMPLE_RATE 44100 #define I2S_SAMPLE_BITS 16 #define I2S_CHANNEL_NUM 2 #define I2S_DMA_BUF_COUNT 8 void app_main() { // 初始化I2S接口 i2s_config_t i2s_config = { .mode = I2S_MODE_MASTER | I2S_MODE_TX, .sample_rate = I2S_SAMPLE_RATE, .bits_per_sample = I2S_SAMPLE_BITS, .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, .communication_format = I2S_COMM_FORMAT_I2S, .dma_buf_count = I2S_DMA_BUF_COUNT, .dma_buf_len = 1024, .intr_alloc_flags = 0, }; i2s_pin_config_t i2s_pin_config = { .bck_io_num = 26, .ws_io_num = 25, .data_out_num = 33, .data_in_num = I2S_PIN_NO_CHANGE, }; i2s_driver_install(I2S_NUM, &i2s_config, 0, NULL); i2s_set_pin(I2S_NUM, &i2s_pin_config); // 初始化SD卡 esp_vfs_fat_sdmmc_mount_config_t mount_config = { .format_if_mount_failed = true, .max_files = 5, }; sdmmc_host_t host = SDMMC_HOST_DEFAULT(); sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT(); esp_vfs_fat_sdmmc_mount("/sdcard", &host, &slot_config, &mount_config, NULL); // 打开音频文件 FILE* f = fopen("/sdcard/test.pcm", "rb"); if (!f) { printf("failed to open file\n"); return; } // 读取数据并发送到I2S总线 int16_t buf[1024]; size_t read_len; while ((read_len = fread(buf, sizeof(int16_t), 1024, f)) > 0) { size_t i2s_len = read_len * 2; uint8_t i2s_buf[i2s_len]; i2s_write_expand(I2S_NUM, buf, read_len, I2S_SAMPLE_BITS, i2s_buf, i2s_len); i2s_write(I2S_NUM, i2s_buf, i2s_len, portMAX_DELAY); } // 关闭文件和卸载SD卡 fclose(f); esp_vfs_fat_sdmmc_unmount(); } ``` 请注意,以上代码仅供参考,并且可能需要根据您的具体用例进行修改。另外,读取和发送音频数据时需要使用合适的缓冲区大小和数量,以避免数据溢出和下溢。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值