本人使用DSPIC33ev128与AD7606进行通信的过程中使用默认的SPI1可以正确读取7606总线数据,现在改用可映射的SPI2就出现以下问题。
问题1:片选信号在MISO的最后一个周期没有发完就拉高了,如下图所示
问题2:示波器看有输出信号但是SPI2BUF一直为空,单片机没有收到,while (!SPI2STATbits.SPIRBF)这个判别条件始终无法为通过。
问题3:单片机MOSI在发送两个字的数据,如0xff,示波器上显示输出只有一半,只有改为0xffff才显示完全
希望各位大佬不吝赐教,非常感谢代码如下:
void SPI2_Init(void)//主模式
{
TRISCbits.TRISC8 = 0;//设置为输出 SCK
TRISCbits.TRISC2 = 1;//设置为输入 MISO
TRISCbits.TRISC6 = 0;//设置输出 MOSI
RPOR7bits.RP56R = 0b001001;//配置RP35为SCK2引脚 RC8
RPINR22bits.SDI2R = 0b0110010;//配置RPI34为MISO引脚 RB2
RPOR6bits.RP54R = 0b001000;//配置RP54为MOSI引脚 RC
IFS2bits.SPI2IF = 0; //清中断
IEC2bits.SPI2IE = 0; //中断禁止
SPI2CON1bits.SPRE=0b001;
SPI2CON1bits.PPRE=0b01;
SPI2CON1bits.DISSCK = 0; //使能内部 SPI 时钟
SPI2CON1bits.DISSDO = 0; //SDOx引脚由模块控制
SPI2CON1bits.MODE16 = 1; //通信为字节宽 (16位)
SPI2CON1bits.SMP = 0; //输入数据在数据输出时间末端采样
SPI2CON1bits.CKE = 0; //串行输出数据在时钟从工作状态转变为空闲状态时变化
SPI2CON1bits.CKP = 1; //空闲状态时钟信号为高电平;
SPI2CON1bits.SSEN = 0;//模块不使用SS引脚
SPI2CON1bits.MSTEN = 1; //主控模式
SPI2CON2bits.SPIBEN = 0; //传统模式
SPI2STATbits.SPIEN = 1; //使能模块并将SCKx、SDOx、SDIx和SSx配置为串口引脚
SPI2BUF = 0x0000; //写0
IFS2bits.SPI2IF = 0; //清中断
IEC2bits.SPI2IE = 1; //使能中断
}
unsigned int SPI2_ReadByte(unsigned int TxData)
{
SPI2BUF = TxData;
// while (!SPI2STATbits.SPIRBF);
while(SPI2STATbits.SPITBF);
return SPI2BUF;
}
void AD7606_ReadData(void)
{
unsigned int i;
AD_CS_L;
for(i=0;i<8;i++)
{
DB_data[i] = SPI2_ReadByte(dummy);
}
AD_CS_H;
}
void __attribute__((__interrupt__, auto_psv)) _SPI2Interrupt(void)
{
IFS2bits.SPI2IF = 0;//中断标志清零
}
|