四线制
1 cs信号
2 clk
3 mosi
4 somi
收发函数:
static unsigned char SPI_Transmit_Receive(unsigned char Dat)// 1
{
unsigned char RecvData;
SpiaRegs.SPITXBUF = ((unsigned short)Dat)<<8;//
while(!SpiaRegs.SPISTS.bit.INT_FLAG);//
// while((SpiaRegs.SPISTS.all&0x0040) != 0x0040) ;
RecvData = (unsigned char)(SpiaRegs.SPIRXBUF&0x00ff);
return RecvData;
}
SPI的初始化
// Set reset low before configuration changes
// Clock polarity (0 == rising, 1 == falling)
// 8-bit character
// Enable loop-back
//
SpiaRegs.SPICCR.bit.SPISWRESET = 0;
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;//
SpiaRegs.SPICCR.bit.SPICHAR = 7;//8bit
SpiaRegs.SPICCR.bit.SPILBK = 0;//1:self_test
// SpiaRegs.SPIPRI.bit.TRIWIRE=1;//3wrie
//
// Enable master (0 == slave, 1 == master)
// Enable transmission (Talk)
// Clock phase (0 == normal, 1 == delayed)
// SPI interrupts are disabled
//
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;//master
SpiaRegs.SPICTL.bit.TALK = 1;
SpiaRegs.SPICTL.bit.CLK_PHASE =0;
SpiaRegs.SPICTL.bit.SPIINTENA = 0;
//
// Set the baud rate using a 1 MHz SPICLK
// BRR = (LSPCLK / SPICLK) - 1
//25000000 / 1000000) - 1
SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = ((20000000 / 5000000) - 1);//500000:500K
//
// Set FREE bit
// Halting on a breakpoint will not halt the SPI
//
SpiaRegs.SPIPRI.bit.FREE = 1;
//
// Release the SPI from reset
//
SpiaRegs.SPICCR.bit.SPISWRESET = 1;
#endif
void 08_INIT(void) //Power Up
{
ADS_CS_ENABLE();//L
DELAY_US(20);
SPI_Transmit_Receive(0x06);//(CMD_SDATAC);//0x11
DELAY_US(100);
SPI_Transmit_Receive(0x11);//(CMD_SDATAC);//0x11
DELAY_US(4);
//at least 2tclk,sent start sign
ADS131_WriteReg (0x01, 0x93);//config1,RESET
ADS131_WriteReg (0x02, 0xE0);//config2
ADS131_WriteReg (0x03, 0x40);//config3
// DELAY_US(4);
ADS131_WriteReg (0x05, 0x10);//CHnSET
ADS131_WriteReg (0x06, 0x10);//CHnSET
ADS131_WriteReg (0x07, 0x10);//CHnSET
ADS131_WriteReg (0x08, 0x10);//CHnSET
// DELAY_US(1);
ADS131_WriteReg (0x09, 0x10);//CHnSET
ADS131_WriteReg (0x0A, 0x10);//CHnSET
ADS131_WriteReg (0x0B, 0x10);//CHnSET
ADS131_WriteReg (0x0C, 0x10);//CHnSET
DELAY_US(4);
SPI_Transmit_Receive(0x20); /* write */ // first bit
SPI_Transmit_Receive(0x00); // second bit
DELAY_US(1);
IDhao=SPI_Transmit_Receive(0xaa);
//data();//idS
DELAY_US(4);
SPI_Transmit_Receive(0x1a);
DELAY_US(200);
SPI_Transmit_Receive(0x08);//START_CMD
// ADS_START_H();//start --1
DELAY_US(200);
SPI_Transmit_Receive(CMD_RDATAC);//0x10
DELAY_US(4);
}
轮询读即可。
遇到的奇怪问题:
cs必须用IO控制,直接拉低将导致外设ADC芯片直接不工作。