dsp2812与pic16f887 spi通信
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=SpiaRegs.SPIRXBUF; //读数据
j++;
if(j==10) j=0;
for(i=0;i<1000;i++); //延时
}
}
下降沿发送数据波形看着没什么问题
使能信号检查了没 测试中是接收不到数据还是接收到错误的数据
你可以在2812这段单步调试测试 查看寄存器的值 zhangmangui 发表于 2013-6-18 12:25 static/image/common/back.gif
下降沿发送数据波形看着没什么问题
使能信号检查了没 测试中是接收不到数据还是接收到错误的数据
你 ...
能接收到数据,但是数据是错的 感觉还是初始化有问题吧 别的没什么
参考
void InitSpi(void)
{
// Initialize SPI-A:
EALLOW;
GpioMuxRegs.GPFMUX.all = 0x000F;
EDIS;
SpiaRegs.SPICCR.all = 0x0a;///进入初始状态,数据在上升沿输出,自测禁止
SpiaRegs.SPICTL.all = 0x06; //主动模式,禁止中断
SpiaRegs.SPIBRR = 0x1D;//波特率 = LSPCLK/(SPIBRR+1)= 30/30 = 1M
SpiaRegs.SPICCR.all = 0x8a; //退出初始状态
} zhangmangui 发表于 2013-6-18 12:32 static/image/common/back.gif
感觉还是初始化有问题吧 别的没什么
参考
void InitSpi(void)
为什么是0x0a啊,不是接收8为数据吗 改成0X0A后接收的是0XAAAA 0X5555 0X0000 xindehuiyi 发表于 2013-6-18 12:44 static/image/common/back.gif
改成0X0A后接收的是0XAAAA 0X5555 0X0000
我也记不清了你再研究研究看来是你的初始化有问题 程序是正确的,是硬件问题 我的也是读取问题,请问楼主硬件哪里出问题;了? 我觉得controlsuit里面的例程不错,呵呵
页:
[1]