最近在学习stm32f4(和朋友一起做的开发板),板载了pcm1770,当时看到一些开发板上带有pcm1770所以就选了这款芯片,这两天下班后就在公司玩会,结果看到其他开发板上并没有给出关于pcm1770的配置和控制,无奈只能自己探索了。。。 pcm1770 音频接口采用I2S ,控制接口采用spi。 学习板上SPI3作为I2S接口传输音频数据, SPI2控制pcm1770; 一开始没怎么看pcm1770的数据手册,直接配置spi去控制,结果。。。。结果都不知道怎么去测试是否控制,网上找资料没什么结果,只能去看英文数据手册。 下面是PCM1770的控制时序图 MS: 使能脚 低电平使能 MC:时钟 MD: 数据 看完时序图,我开始去修改spi2的配置 SPI_I2S_DeInit(SPI2); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//全双工 SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;//16位数据模式 SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//空闲模式下SCK为1,看时序图 MC在空闲的时候是1 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//数据采样从第2个时间边沿开始,MD信号 在MC=0的时候进行变化,在上升沿的情况下输出 //因为常态下MC=1,又是上升沿锁定数据输出,所以选择第二个时钟沿 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//NSS软件管理 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;//波特率, SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//大端模式 SPI_InitStructure.SPI_CRCPolynomial = 0;//CRC多项式 SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//主机模式 SPI_Init(SPI2, &SPI_InitStructure); SPI_Cmd(SPI2, ENABLE); 下面是操作PCM1770的函数 void PCM1Writereg(u8 WriteAddr, u8 WriteData) { u16 WriteAddrData; WriteAddrData = (0x00FF & WriteAddr); WriteAddrData = WriteAddrData << 8; WriteAddrData = WriteAddrData | WriteData; GPIO_ResetBits(GPIOB,GPIO_Pin_11);//MS 使能 delay_us(100); SPI2_RWByte(WriteAddrData); GPIO_SetBits(GPIOB,GPIO_Pin_11);//MS 失能 delay_us(100); } 这样配置之后 我又开始去控制,还是不知道是不是正确控制了,后来我看了下pcm1770的寄存器 MUTx: Soft Mute Control Where, x = L or R, corresponding to the headphone output HOUTL or HOUTR. 我试着去控制静音,但是还没设置I2S接口,没送数据,也不知道是不是设置正确了。。。。 我看到了器件第10脚是个音频输入脚,之后pcm1770的03寄存器bit4,发现这个AIN是可以通过寄存器控制的 我是做安防的,身边的音频视频源比较多,直接接上,使能03寄存器的bit4 将音频信号接到第10脚 耳机听到了声音,之后失能03寄存器的bit4 接上音频信号源 耳机没声音了。。。控制总算正确了。。。。 另外 pcm1770的04寄存器bit0位是来控制掉电和正常模式的,一共4个寄存器比较简单。 回过头来看pcm1770的控制,发现本人过分依赖网上的资料,看,懒得去看数据手册,懒得去探索,其实静下心来去自己摸索,往往并没有自己想想的那么难,反而能收获一定的能力和成功的喜悦。。。希望有和我一样毛病的技术员能够吸取教训。 今天用了st官方提供的i2s的例程中的音频数据C文件进行播放测试,效果还行接下来会继续本人在调试I2S接口中的问题和收获。。 |
|