SPI初始化程序:
?
//ADT7320的SPI配置
void initSPI(void)
{
IFS0bits.SPI1IF = 0; // Clear the Interrupt flag
IEC0bits.SPI1IE = 0; // Disable the interrupt
//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 the Interrupt 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 ………这样循环输出
?