#define SIMO GpioDataRegs.GPBDAT.bit.GPIO54
#define SOMI GpioDataRegs.GPBDAT.bit.GPIO55
#define Clock GpioDataRegs.GPBDAT.bit.GPIO56
#define SPI_CS GpioDataRegs.GPBDAT.bit.GPIO57
Uint16 cycle;
Uint16 MRS,Addr,CRC;
Uint16 main()
{
delay(10);
InitSysCtrl();
InitXintf16Gpio();
// Disable CPU interrupts
DINT;
InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
InitSpiaGpio();
MRS=0;
Addr=0;
CRC =0;
while(1)
{
Reset_Encoder();
delay(50);
cycle = cycle%16;
LED=cycle;
cycle++;
}
}
void Reset_Encoder(void) // DSP发送数据
{ Uint16 i;
MasterStartSend();
SPI_CS=1; //主发送状态
send_bits(6,0x2a);
send_bits(8,0x81);
send_bits(16,0x8001);
SPI_CS=0; //主接收状态
MasterStartReceive();
receive_bits(8,MRS);
receive_bits(16,Addr);
receive_bits(5,CRC);
Clock=1;
delay_us(5);
delay_us(30);
}
void MasterStartSend(void)
{ Clock=0;
delay_us(5);
Clock=1;
delay_us(5);
Clock=0;
delay_us(5);
Clock=1;
delay_us(5);
}
void send_bits(Uint16 length,Uint16 bits) //下降沿发送数据 先高后低
{ Uint16 i;
Clock=0;
for(i=0;i<length;i++) // -------
{ // |
SIMO=bits >> (length-i-1);
delay_us(5);
Clock=1;
delay_us(5);
Clock=0;
}
// |
// |
}
void MasterStartReceive(void)
{
Clock=0;
delay_us(5);
Clock=1;
delay_us(5);
Clock=0;
delay_us(5);
Clock=1;
delay_us(5);
Clock=0;
delay_us(5);
Clock=1;
delay_us(1);
while(SOMI !=1)
{
delay_us(4);
Clock=0;
delay_us(5);
Clock=1;
delay_us(1);
}
delay_us(4);
Clock=0;
delay_us(5);
}
void receive_bits(Uint16 length,Uint16 bits) //上升沿接收数据 先低后高 length<16
{ Uint16 i;
bits=0;
Clock=1;
delay_us(1);
for(i=0;i<length-1;i++) // -------
{ // |
bits+=SOMI>>i; // |
delay_us(4); // |
Clock=0; // --------
delay_us(5);
Clock=1;
delay_us(1);