使用dsPIC33FJ128MC804的SPI读取ADT7320,出现问题
SPI初始化程序:
//ADT7320的SPI配置
void initSPI(void)
{
IFS0bits.SPI1IF = 0; // Clear theInterrupt flag
IEC0bits.SPI1IE = 0; // Disable theinterrupt
//SPIxSTAT
SPI1STATbits.SPIEN=0;//禁止模块
SPI1STATbits.SPISIDL=0;//在空闲模式下模块继续工作
//SPIxCON1
SPI1CON1bits.DISSCK=0;//使能内部SPI时钟
SPI1CON1bits.DISSDO=0;//SDOx 引脚由模块控制
SPI1CON1bits.MODE16=0;//采用字宽(8位)通信
SPI1CON1bits.SMP=0;//在数据输出时间的中间采样输入数据
SPI1CON1bits.CKE=1;//串行输出数据在时钟从空闲状态转变为工作状态时变化
SPI1CON1bits.SSEN=1;//模块使用 SSx 引脚
SPI1CON1bits.CKP=1;//空闲状态时时钟信号为高电平;工作状态时为低电平
SPI1CON1bits.MSTEN=1;//主模式
SPI1CON1bits.SPRE=6;//2分频
SPI1CON1bits.PPRE=0;//64分频
//
SPI1STATbits.SPIEN=1;//开启模块
SPI1BUF=0x0000;
IFS0bits.SPI1IF = 0; // Clear theInterrupt flag
//上电后,复位串行接口(在DIN上连续输入32个逻辑1)。这可以确保所有内部电路被适当复位
SPI1BUF=0xff;Nop();
SPI1BUF=0xff;Nop();
SPI1BUF=0xff;Nop();
SPI1BUF=0xff;
DELAY_MS(1000);
}
//写一个字节程序
uchar SPI1_WRT(uchar A)
{uchar BUF;
SPI1BUF=A;
while(SPI1STATbits.SPITBF==1);//等待写结束
while(SPI1STATbits.SPIRBF==0);//等待写结束
BUF=SPI1BUF;
return(BUF);
}
//主程序内的程序
while(1) //01 011 000
{ SPI1_WRT(0x58);Nop(); //寄存器0x03,读ID
tempervalue=SPI1_WRT(0x58);
delay_ms(100);
}
按照PDF上说的,应该得到0xc3
而得到的是0xc2, 下一次读取的是0x01
0xc2, 0x01 0xc2, 0x01 0xc2, 0x01 ………这样循环
你好,不知道问题有没有得到解决?我用ADT7320的时候也碰到了这种现象,读0x03寄存器得到的是194,不过重复读取不会出现变化。
如果不管这个问题继续读取温度的话 会出现 30(正常温度) → -15 → 0 这种三个数据循环..
请问下ADT7320你们采用的是几伏供电?单片机是几伏的?
3.3V的
解决了吗
temp=ReadFromADT7320(0x02); //读取温度值数据
//处理温度值
temp= temp >> 3;
if( (temp & 0x8000) == 0x8000 )
{
//continue;
flag=1;
temp=8192-temp;
}
di=temp>>4; // ___.
dd=(temp%16)*625/10; // 0.____ 4
display(flag,di,dd);
解决了,不过忘了具体的过程。
供电正常嘛