最近在使用28379D作为SPI 主机与从机芯片通信时遇到一些问题,请大家赐教。
我将SPIA作为master通信,从机是一个集成了ADF4158芯片的模块,只需要基于SCK,MOSI与片选CS即可。因此在硬件设计上,我只将GPIO16(SPISIMOA)、GPIO18(***)分别与该模块的SIMO和CLK相连,另用一个GPIO作为从机的片选信号。
我目前存在的疑惑有:
(1)GPIO17和GPIO19都悬空,不知这样是否会影响SPI的正常工作?
(2)我没有采用FIFO模式,不知这个模式与普通SPI有何区别?
(3)在我只需要主机发送数据,而不需要读取从机返回的数据时,以下代码是否能够成功实现8bit数据TxData的传输?
uint8_t REF_SPI_ReadWriteByte(uint8_t TxData)
{
uint8_t dummy = 0;
// waiting for the complement of previous character shifting
while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG == 1) { }
SpiaRegs.***.bit.TALK = 1; // Enable Transmit path
SpiaRegs.SPITXBUF = TxData; // Master transmits data
while(SpiaRegs.SPISTS.bit.INT_FLAG !=1){}//Non-FIFO mode
dummy = SpiaRegs.SPIRXBUF; // Clears junk data from itself bc it rx’d same data tx’d
return dummy;
}
(4)实际的需求是需要向从机写32bit的指令,一共有七条指令需要写入,以下代码能否实现我想要的功能?(temp即为需要同一次写入的32bit指令,从机芯片要求在写入前将片选RADAR_SPI_TX_CS拉低,写完后再拉高)
static void WriteToADF4158(uint32_t* buff,uint32_t address)
{
uint32_t temp;
temp = *(buff + address);
GPIO_WritePin(RADAR_SPI_TX_CS,0);//enable
Delay_ms(20);
REF_SPI_ReadWriteByte((uint8_t)(temp>>24));
REF_SPI_ReadWriteByte((uint8_t)(temp>>16));
REF_SPI_ReadWriteByte((uint8_t)(temp>>8));
REF_SPI_ReadWriteByte((uint8_t)(temp));
Delay_ms(40);
GPIO_WritePin(RADAR_SPI_TX_CS,1);//disable
}
(5)在这些代码的配置下,从机的输出看起来就是噪声,感觉根本没有数据写入。由于DSP选用的是ZWT封装,SPI接口模块也无法用探针去测试SCK或者MOSI的波形,我该如何验证呢?
以下是我相关SPI的配置代码,其中SPI的速率设置为500kHz,满足从机的时钟需求:
void InitSpiaGpio()
{
EALLOW;
//
// Enable internal pull-up for the selected pins
//
// Pull-ups can be enabled or disabled by the user.
// This will enable the pullups for the specified pins.
// Comment out other unwanted lines.
//
GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0; // Enable pull-up on GPIO16 (SPISIMOA)
// GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0; // Enable pull-up on GPIO5 (SPISIMOA)
GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0; // Enable pull-up on GPIO17 (SPISOMIA)
// GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0; // Enable pull-up on GPIO3 (SPISOMIA)
GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0; // Enable pull-up on GPIO18 (***)
// GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0; // Enable pull-up on GPIO19 (SPISTEA)
//
// Set qualification for selected pins to asynch only
//
// This will select asynch (no qualification) for the selected pins.
// Comment out other unwanted lines.
//
GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3; // Asynch input GPIO16 (SPISIMOA)
// GpioCtrlRegs.GPAQSEL1.bit.GPIO5 = 3; // Asynch input GPIO5 (SPISIMOA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3; // Asynch input GPIO17 (SPISOMIA)
// GpioCtrlRegs.GPAQSEL1.bit.GPIO3 = 3; // Asynch input GPIO3 (SPISOMIA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3; // Asynch input GPIO18 (***)
// GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3; // Asynch input GPIO19 (SPISTEA)
//
//Configure SPI-A pins using GPIO regs
//
// This specifies which of the possible GPIO pins will be SPI functional
// pins.
// Comment out other unwanted lines.
//
GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1; // Configure GPIO16 as SPISIMOA
// GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 2; // Configure GPIO5 as SPISIMOA
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1; // Configure GPIO17 as SPISOMIA
// GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 2; // Configure GPIO3 as SPISOMIA
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1; // Configure GPIO18 as ***
// GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1; // Configure GPIO19 as SPISTEA
EDIS;
}
void InitSpia(void)
{
// Initialize SPI-A
// Set reset low before configuration changes
// Clock polarity (0 == rising, 1 == falling)
// 16-bit character
// Enable loop-back
SpiaRegs.***.bit.SPISWRESET = 0;
SpiaRegs.***.bit.CLKPOLARITY = 0;
SpiaRegs.***.bit.*** = (8-1);//(16-1)
SpiaRegs.***.bit.SPILBK = 0;//1;loopback disable(0)
// Enable master (0 == slave, 1 == master)
// Enable transmission (Talk)
// Clock phase (0 == normal, 1 == delayed)
// SPI interrupts are disabled
SpiaRegs.***.bit.MASTER_SLAVE = 1;
SpiaRegs.***.bit.TALK = 1;
SpiaRegs.***.bit.CLK_PHASE = 0;//0
SpiaRegs.***.bit.SPIINTENA = 0;
// Set the baud rate
SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = SPI1_BRR;
// Set FREE bit
// Halting on a breakpoint will not halt the SPI
SpiaRegs.SPIPRI.bit.FREE = 1;
SpiaRegs.SPIPRI.bit.TRIWIRE = 0;
SpiaRegs.SPIFFTX.bit.SPIFFENA = 0;//disable FIFO
// Release the SPI from reset
SpiaRegs.***.bit.SPISWRESET = 1;
}
希望大家能帮帮我,每个问题可能都很琐碎,错误也可能很基础,谢谢大家的不吝赐教!