Microchip
直播中

尹丽

7年用户 199经验值
私信 关注
[问答]

无法从MEMS麦克风读取内容怎么办

大家好,我一直在试着用数字PCB上的MEMS麦克风录制一些东西。PCB有一个12位的ti ADC和SPI接口,它应该根据声音的音量给我16位的无符号整数(最有意义的4位是零)。所以,我基本上设置了DSIC33 FJ128MC804的SPI接口到16位,试图读取单词。因为我真的不知道TI的ADC的转换时间,所以在每次读数结束时,我都会造成很大的延迟。当没有声音并且声音非常大时(从麦克风旁边的在线音调发生器发出100Hz),我在逻辑分析仪上看到几乎相同的值。而且,当我在每个记录会话结束时查看监视窗口时,我看到所有存储的数据和SPI1BUF内容都为零。这是不应该发生的,因为有数据进入处理器的SDI端口,我在逻辑分析仪上看到了。语句,断点=1,是当我实际上停止程序从表窗口读取值时。这是我的代码。如果您能给我一些提示,我很感激。//dspic33fj128mc804的ADC处于自动采样模式,从数字麦克风include//配置寄存器-FOSCSELpragma config IESO=0//用用户选择的振荡器在resetpragma config FNOSC=7//select FRC os os开始记录。在复位//配置寄存器-FOSC#pragma配置FCKSM=3//时钟切换和故障安全模式都被禁用#pragma配置IOL1WAY=1//只允许一个重新配置-这里不适用#pragma配置OSCIOFNC=0//OSCO引脚是一个通用I/O引脚#prag配置POSCMD=3//主振荡器被禁用//配置电路内编程器,WDT\\\\\\\\\\\\\\\\\\\\\\\\\\\\\CCON|0x40)无符号字符SPI_Receive(){.(SPI1STATbits.SPITBF==1);//等待直到TX缓冲区由于之前的处理SPI1BUF=0x0000而为空;//当为空时,将垃圾字(0x0000)发送到TX缓冲区,而同时发送(SPI1STATbits.SPIRBF==0);//随着垃圾位移出,从垃圾位输入的有效位SDI端口//等待直到RX缓冲区充满有效数据返回SPI1BUF;//当满时,通过SPI1BUF}int main(){//OSCTUN RegisterOSCTUNbits.TUN=0;//选择FRC=7.37MHz//CLKDIV RegisterCLKDIVbits.FRCDIV=6;//FRCDIVN=FRC/64=FRC/64=115.15KHz->DOZE=1;//FCY=FOSC/4=115.15/4=28.8KHzCLKDIVbits.DOZEN=1;//DOZE定义了发送16位SPI1CON1bits.DISSCK=0;//启用内部SPI时钟SPI1CON1bits.DISSDO=0;//启用SPI数据output,SDOSPI1CON1bits.MODE16=1;//启用16位数据modeSPI1CON1bits.SSEN=0;//此单元不是从设备,因此不使用从设备选择引脚SPI1CON1bits.MSTEN=1;//启用MASTER modeSPI1CON1bits.SMP=0;//在SKSPI1CON1bits的neg边缘接收到pos边缘的样本输入。= 1; //SCK边:当SCK从活动状态变为IDLE状态SPI1CON1bits时,输出数据发生变化。CKP=0;//SCK极性:IDLE是低相,而活动状态是SCKSPI1CON1bits的高相。PPRE=1;//主SPI时钟预刻度是1:1SPI1CON1bits。SPRE=7;//次SPI时钟预刻度是1:1->;SCK=1SPIROV=0;SPI1BUFSPI1STATbits.SPIEN=1;SPI1BUFSPI1STATbits.SPIEN=1;启用SPI接口//外围引脚选择与RP引脚PPSUnLock;RPOR4bits.RP8R=8;RP8用于SCK1(输出))RPINR20bits.SCK1R=8;RP8用于SCK1(输入))RPINR20bits.SDI1R=7;//RP7表示SDI1RPOR3bits.RP6R=9;//RP6表示SS1PPSLock;//Define digital I/OTRISBbits.TRISB6=0;//Configure RB6表示SSTRISBbits.TRISB8=0的输出;//Configure RB8表示SCK1 TRISBbits.TRISB7=1;//Configure RB7表示SDI1unsigned int i的输入Delay,breakpoint;unsigned int Word[4];for(i=0;i<4;i++)//Store 4 16-bitword{LATBbits.LATB6=0;//Lo.SS for object data receptionWord=SPI_Receive();LATBbits.LATB6=1;//Raise SS for object data completion for(Delay=0;Delay<1000;Delay+);//ADC转换延迟}b bRekPosits=1;}

回帖(9)

王荣

2020-4-23 10:34:20
谢谢你注意到这一点。我应该把函数改为“无符号整数”,当我在SPI寄存器中把字节op改为单词op时。但是,我仍然一无所获。同样的问题:(还有其他的想法吗?)以下是新函数:unsigned int SPI_Receive(){.(SPI1STATbits.SPITBF==1);//等待直到TX缓冲区由于以前的进程SPI1BUF=0x0000而为空;//当为空时,将垃圾字(0x0000)发送到TX缓冲区,而同时发送(SPI1STATbits.SPIRBF==0);//随着垃圾位移出,有效位从SDI端口输入//等待直到RX缓冲区充满有效数据返回SPI1BUF;//当满时,通过SPI1BUF}读取RX缓冲区中的有效数据
举报

李兆峰

2020-4-23 10:47:17
好的,波形,真的可以吗?
举报

李子跃

2020-4-23 11:11:34
您正在将PIN RB6设置为PPS SPI1SS SS输出,在主模式下没有帧,然后尝试手动驱动它。
举报

李兆峰

2020-4-23 11:32:45
除此之外,我会尝试拉SDI高只是检查SPI是否接收所有1S。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分