完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
如题,使用STM32单片机开发板控制AIC3254EVM评估板,走I2C总线,只链接了SCL SDA和地线三根线:
首先确认了单片机那边的I2C接口是没有问题的,I2C时序是软件模拟的。AIC3254功能板的WCLK BCLK悬空,MCLK接底板母板。 然后使用PPS生成初始化代码头文件并加入到工程中: 现在的问题是,程序访问AIC3254的各个寄存器都没有问题的,都能正常读写,但是就是【无法听到声音,也就是AIC3254的配置没有完全正确】,这也是我这次发帖求助的原因,请各位看下是哪里配置错了,是硬件问题还是软件问题? STM32 I2C驱动代码贴出来: void I2C_Init() { I2C_GPIO_CLKEN; GPIO_Initure.Pin=I2C_SCL_PIN|I2C_SDA_PIN; GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; GPIO_Initure.Pull=GPIO_PULLUP; GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(I2C_GPIO,&GPIO_Initure); I2C_SDA_SET; I2C_SCL_SET; } void IIC_Start() { SDA_OUT(); I2C_SDA_SET; I2C_SCL_SET; Delay_us(4); I2C_SDA_CLR; Delay_us(4); I2C_SCL_CLR; } void IIC_Stop() { SDA_OUT(); I2C_SCL_CLR; I2C_SDA_CLR; Delay_us(4); I2C_SCL_SET; I2C_SDA_SET; Delay_us(4); } unsigned char IIC_Wait_Ack() { unsigned char ucErrtime=0; SDA_IN(); I2C_SDA_SET; Delay_us(1); I2C_SCL_SET; Delay_us(1); while(I2C_SDA_READ) { ucErrTime++; if(ucErrTime>250) { IIC_Stop(); return 1; } } I2C_SCL_CLR; return 0; } void IIC_Ack() { I2C_SCL_CLR; SDA_OUT(); I2C_SDA_CLR; Delay_us(2); I2C_SCL_SET; Delay_us(2); I2C_SCL_CLR; } void IIC_NAck() { I2C_SCL_CLR; SDA_OUT(); I2C_SDA_SET; Delay_us(2); I2C_SCL_SET; Delay_us(2); I2C_SCL_CLR; } //IIC发送一个字节 //返回从机有无应答 //1,有应答 //0,无应答 void IIC_Send_Byte(unsigned char txd) { unsigned char t; SDA_OUT(); I2C_SCL_CLR; //拉低时钟开始数据传输 for(t=0;t<8;t++) { if((txd&0x80)==0x80) I2C_SDA_SET; else if((txd&0x80)==0) I2C_SDA_CLR; txd<<=1; Delay_us(2); I2C_SCL_SET; Delay_us(2); I2C_SCL_CLR; Delay_us(2); } } //读1个字节,ack=1时,发送ACK,ack=0,发送nACK unsigned char IIC_Read_Byte(unsigned char ack) { unsigned char i,receive=0; SDA_IN(); for(i=0;i<8;i++ ) { I2C_SCL_CLR; Delay_us(2); I2C_SCL_SET; receive<<=1; if(I2C_SDA_READ)receive++; Delay_us(1); } if (!ack) IIC_NAck();//发送nACK else IIC_Ack(); //发送ACK return receive; } unsigned char AIC3254_ReadOneRes(int addr) { unsigned char temp=0; IIC_Start(); IIC_Send_Byte(0x30); IIC_Wait_Ack(); IIC_Send_Byte(addr); IIC_Wait_Ack(); IIC_Start(); IIC_Send_Byte(0x31); IIC_Wait_Ack(); temp=IIC_Read_Byte(0); IIC_Stop(); return temp; } void AIC3254_WriteOneRes(int addr,unsigned char data) { IIC_Start(); IIC_Send_Byte(0x30); IIC_Wait_Ack(); IIC_Send_Byte(addr); IIC_Wait_Ack(); IIC_Send_Byte(data); IIC_Wait_Ack(); IIC_Stop(); //Delay_ms(1); } void AIC3254_WriteMultiRes(int addr,unsigned char data[],int size) { int i=0; IIC_Start(); IIC_Send_Byte(0x30); IIC_Wait_Ack(); for(i=0;icurrent_loc; int burst_write_count = 0; /* check if first location is page register, and populate page addr */ if (program_ptr[index].reg_off == 0){ parse_data->page_num = program_ptr[index].reg_val; parse_data->reg_num = program_ptr[index].reg_off; parse_data->burst_array[burst_write_count++] = program_ptr[index].reg_val; index++; goto finish_out; } /* if it’s not page register, store the reg_off and val into array */ parse_data->reg_num = program_ptr[index].reg_off; parse_data->burst_array[burst_write_count++] = program_ptr[index].reg_val; index++; /* check if the reg addr is continue or not */ for (; index < program_size; index++){ if (program_ptr[index].reg_off != (program_ptr[index - 1].reg_off + 1)){ break; } else{ parse_data->burst_array[burst_write_count++] = program_ptr[index].reg_val; } } finish_out: parse_data->burst_size = burst_write_count; if (index == program_size){ /* parsing completed */ parse_data->current_loc = -1; } else{ parse_data->current_loc = index; } } void minidsp_burst_transfer(const reg_value *program_ptr, int program_size) { int i; minidsp_parser_data parse_data; /* point the current location to start of program array */ parse_data.current_loc = 0; parse_data.page_num = 0; parse_data.reg_num = 0; do { /* Prepare burst data */ minidsp_get_burst(program_ptr, program_size, &parse_data); /* Send burst data */ AIC3254_WriteMultiRes(parse_data.reg_num,parse_data.burst_array,parse_data.burst_size); } while (parse_data.current_loc != -1); } void process_flow_download(reg_value *REG_Section, int program_size) { static int reg_index = 0; unsigned char result,page; for ( ; reg_index < program_size; reg_index++) { if (REG_Section[reg_index].reg_off == 254) { Delay_ms(REG_Section[reg_index].reg_val); continue; } else if (REG_Section[reg_index].reg_off == 255) { if (REG_Section[reg_index].reg_val == 0) { // Program_miniDSP_A; printf("对miniDSP_A编程n"); minidsp_burst_transfer(miniDSP_A_reg_values, miniDSP_A_reg_values_COEFF_SIZE + miniDSP_A_reg_values_INST_SIZE); } if (REG_Section[reg_index].reg_val == 1) { // Program_miniDSP_D; printf("对miniDSP_D编程n"); minidsp_burst_transfer (miniDSP_D_reg_values, miniDSP_D_reg_values_COEFF_SIZE + miniDSP_D_reg_values_INST_SIZE); } continue; } else if(REG_Section[reg_index].reg_off==0) page=REG_Section[reg_index].reg_val; AIC3254_WriteOneRes(REG_Section[reg_index].reg_off,REG_Section[reg_index].reg_val); result=AIC3254_ReadOneRes(REG_Section[reg_index].reg_off); if(result!=REG_Section[reg_index].reg_val) printf("写入不正确 %d页 %d 0x%x 0x%xn",page,REG_Section[reg_index].reg_off,REG_Section[reg_index].reg_off,result); } } main函数: I2C_Init(); process_flow_download(REG_Section_program,sizeof(REG_Section_program)/sizeof(REG_Section_program[0])); printf("全部写入完成n"); AIC3254_WriteOneRes(0,0); //AIC3254_WriteOneRes(1,0x04); AIC3254_WriteOneRes(81,0xc0); AIC3254_WriteOneRes(63,0xd4); //printf("0x%xn",AIC3254_ReadOneRes(1)); printf("第0页第81个寄存器 ADC通道启动寄存器值:0x%xn",AIC3254_ReadOneRes(81)); printf("第0页第63个寄存器 DAC通道启动寄存器值:0x%xn",AIC3254_ReadOneRes(63)); AIC3254_WriteOneRes(0,8); AIC3254_WriteOneRes(1,0x04); printf("第8页第1个寄存器 ADC滤波寄存器值:0x%xn",AIC3254_ReadOneRes(1)); AIC3254_WriteOneRes(0,44); AIC3254_WriteOneRes(1,0x04); printf("第8页第1个寄存器 DAC滤波寄存器值:0x%xn",AIC3254_ReadOneRes(1)); |
|
相关推荐
2个回答
|
|
STM32单片机那边必须提供一路PWM方波脉冲给评估板的mclk引脚用,一路5V供电和一路3V供电给评估板用,并且最重要的是,两个板子必须共地。
|
|
|
|
根据您的描述,您已经确认了STM32单片机的I2C接口没有问题,并且可以正常读写AIC3254的寄存器。但是无法听到声音,可能是AIC3254的配置没有完全正确。以下是一些建议和可能的解决方案:
1. 检查硬件连接:确保AIC3254 EVM评估板的WCLK、BCLK和MCLK引脚连接正确。您提到WCLK和BCLK悬空,这可能会导致音频信号无法正常传输。请参考AIC3254的数据手册,确保这些引脚连接正确。 2. 检查I2C时序:虽然您提到I2C时序是软件模拟的,但仍然建议您检查时序是否符合AIC3254的要求。您可以使用示波器或逻辑分析仪检查I2C总线的时序。 3. 检查AIC3254的配置:请确保您已经正确配置了AIC3254的寄存器。这包括设置正确的采样率、输入输出模式、增益等。您可以查阅AIC3254的数据手册,确保您的配置是正确的。 4. 检查STM32单片机的音频输出:请确保STM32单片机的音频输出引脚连接正确,并且已经正确配置为音频输出模式。此外,检查音频输出引脚的驱动能力是否足够驱动您的扬声器。 5. 检查音频信号:您可以使用示波器或逻辑分析仪检查AIC3254的音频输出信号。如果音频信号正常,但仍然无法听到声音,请检查扬声器是否正常工作。 6. 更新驱动代码:您提到使用了PPS生成的初始化代码头文件。请确保这些代码是最新的,并且与您的硬件配置兼容。如果可能,尝试使用其他I2C驱动库,如STM32 HAL库,看看是否能解决问题。 7. 调试和测试:在调试过程中,您可以逐步检查每个步骤,确保每个部分都正常工作。例如,您可以先测试I2C通信,然后测试AIC3254的配置,最后测试音频输出。 通过以上步骤,您应该能够找到问题所在,并解决无法听到声音的问题。希望这些建议对您有所帮助! |
|
|
|
只有小组成员才能发言,加入小组>>
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
683 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
599 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1054 浏览 1 评论
739 浏览 0 评论
普中科技F28335开发板每次上电复位后数码管都会显示,如何熄灭它?
524 浏览 1 评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
161浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
125浏览 14评论
在使用3254进行录音的时候出现一个奇怪的现象,右声道有吱吱声,请教一下,是否是什么寄存器设置存在问题?
126浏览 13评论
TLV320芯片内部自带数字滤波功能,请问linein进来的模拟信号是否是先经过ADC的超采样?
122浏览 12评论
TPA6304-Q1: TPA6304 两片公用一组I2C的话,其中一片配置不成功怎么办
168浏览 10评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 23:04 , Processed in 1.019556 second(s), Total 86, Slave 68 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号