使用PIC16F1503利用SPI口对LT8900进行读写操作。
通过示波器观察波形,现在发现:写进去的字节波形是对的,但是读回来的字节波形有对的,也有错的。
即MISO返回的数据是有误的。
硬件上,SCK,MISO,MOSI和芯片是直接连接的,没加上拉或下拉电阻
问题到底出在哪呢??望高手们指教
对SPI的配置如下:
void SPI_Init(void)
{
TRISCbits.TRISC0 = 0; //SCK引脚设置为输出
TRISCbits.TRISC1 = 1; //MISO引脚设置为输入
TRISCbits.TRISC2 = 0; //MOSI引脚设置为输出
TRISCbits.TRISC4 = 0; //片选引脚设置为输出
APFCONbits.SDOSEL = 0; //SDO功能在引脚 RC2-
//配置SPI的格式 //1,1,1或者0,0,0
SSP1STAT |= (0X01 << 7);
SSP1CON1 = 0X21; //SPI Master mode,clock = Fosc/16 = 1Mhz,使能SPI
}
//SPI接口发送和接收数据函数
static unsigned char SPI_SendReadByte(unsigned char dat)
{
unsigned char readbyte;
// SSP1CON1bits.WCOL = 0; //清楚写冲突标志位(WCOL),允许写SSP1BUF寄存器
PIR1bits.SSP1IF = 0;
// SSP1CON1bits.SSPOV = 0;
SSP1BUF = dat;
while(!PIR1bits.SSP1IF);
PIR1bits.SSP1IF = 0;
while(!SSP1STATbits.BF);
readbyte = SSP1BUF; //读取接收缓冲器中的数据
// PIR1bits.SSP1IF = 0; //清除接收完成标志位
return readbyte; //返回接收到的数据
}
unsigned int LT_ReadReg(unsigned char reg)
{
unsigned char ReadValueH,ReadValueL;
LATCbits.LATC4 = 0; //片选引脚拉低,使能
SPI_SendReadByte(reg+0X80); //读取寄存器的值
Delay_5us;
ReadValueH = SPI_SendReadByte(0X00);
ReadValueL = SPI_SendReadByte(0X00);
Delay_5us;
LATCbits.LATC4 = 1;
return (ReadValueH << 8 + ReadValueL); //返回读取到的寄存器值
}
|