PIC与2812进行通信 pic为主机 2812为从机,从机接收信号总是出错,求解答
pic主机spi发送波形
pic主机发送程序 晶振为4M 时钟周期为1M
void main(void)
{
ANSEL=0X00; //所有IO为数字IO
ANSELH=0X00; //所有IO为数字IO
OSCCON=0X08; //系统时钟由CONFIG决定
TRISC5=0; //SDO
TRISA5=0; //cs
TRISC3=0; //CLK信号
SSPCON=0X20; //主机模式 clk空闲时低电平
SSPSTAT=0X00; //下降沿发送数据
uchar j=0,i=0;
while(1)
{
RA5=0; //cs选通
for(uchar i=0;i<5;i++);
SSPBUF=0x55; //发送数据
while(!SSPIF); //等待发送结束
SSPIF=0;
for(uchar i=0;i<5;i++);
RA5=1;
for(uchar i=0;i<240;i++) //延时
for(uchar h=0;h<50;h++);
}
}
dsp从机接收程序
void InitSpi(void)
{
EALLOW;
//spi
GpioMuxRegs.GPFMUX.bit.SPICLKA_GPIOF2=1;
GpioMuxRegs.GPFMUX.bit.SPISIMOA_GPIOF0=1;
GpioMuxRegs.GPFMUX.bit.SPISOMIA_GPIOF1=1;
GpioMuxRegs.GPFMUX.bit.SPISTEA_GPIOF3=1;
EDIS;
// Initialize SPI-A:
SpiaRegs.SPICCR.all=0x07; //每次移位8个 下降沿接收数据
SpiaRegs.SPICTL.all=0x00; //从机模式 禁止发送
SpiaRegs.SPIBRR=24; //晶振为20M 波特率为 20*10//2/4/25=1M
SpiaRegs.SPISTS.all=0;
SpiaRegs.SPICCR.all=0x87; //重启spi
// SpiaRegs.SPIPRI.bit.FREE=1;
//tbd...
}
unsigned int Spi_TxReady(void)
{
unsigned int i;
if(SpiaRegs.SPISTS.bit.BUFFULL_FLAG == 1)
{
i = 0;
}
else
{
i = 1;
}
return(i);
}
unsigned int Spi_RxReady(void)
{
unsigned int i;
if(SpiaRegs.SPISTS.bit.INT_FLAG == 1)
{
i = 1;
}
else
{
i = 0;
}
return(i);
}
void main()
{
uchar i=0,j=0,k;
InitSysCtrl();
DINT;
IER=0x0000;
IFR=0x0000;
InitPieCtrl();
InitPieVectTable();
InitPeripherals();
InitSpi();
InitGpio();
EINT;
ERTM;
i=0;
j=0;
while(1)
{
// if(Spi_RxReady()==1)
while(SpiaRegs.SPISTS.bit.INT_FLAG==0); //等待接收数据
sp_data[j]=SpiaRegs.SPIRXBUF; //读数据
j++;
if(j==10) j=0;
for(i=0;i<1000;i++); //延时
}
}
|