我希望使用SPI与一款电能采集芯片通信,它读取数据需要先发送1个字节,再等2us,然后接收3个字节。我看了手册发现SPI每次通信好像都要发送16位数据,也就是向TXBUFF里面写一次数据就触发一次16位的移位。我看到可以用SPICCR.0-3控制传输数据的长度,但是在实际使用的时候发现也还是一次移了16位,我就不清楚该如何进行配置操作,我没有检索到相关的资料就来这里问一下,希望能够得到帮助!
我使用loopback功能,配置SPICHAR为7,然后当我调用读写函数:temp4 = SPIA_SendReciveData(0xD312);得到的数据是0x12D3。看上去是依旧传送了16位,不应该是只传送了12,D3被忽略了,然后得到的数据是0x12吗
void SPIA_Normal_Init(void)
{
//使能SPI时钟以及初始化对应的GPIO
EALLOW;
SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1; // 使能SPI-A外设时钟
EDIS;
InitSpiaGpio(); // 初始化SPIA对应的GPIO管脚
//配置SPI工作方式以及参数设置,包括数据格式、相位极性、FIFO功能
//清零Reset位复位SPI;clock polarity=0:上升沿发送、下降沿接收;禁用回路模式;使用16位数据长度
SpiaRegs.SPICCR.bit.SPISWRESET = 0;
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
SpiaRegs.SPICCR.bit.SPILBK = 1;
SpiaRegs.SPICCR.bit.SPICHAR = 0x7;
//禁止接收溢出中断;clock phase=1:无延时;主机模式;使能发送功能;禁止总中断
SpiaRegs.SPICTL.bit.OVERRUNINTENA = 0;
SpiaRegs.SPICTL.bit.CLK_PHASE = 1;
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;
SpiaRegs.SPICTL.bit.TALK = 1;
SpiaRegs.SPICTL.bit.SPIINTENA = 0;
// SpiaRegs.SPIFFTX.all=0xE040; //使能FIFO发送;清除TXFIFO发送中断;禁止TX FIFO与TXFFIVL匹配中断;设置TX FIFO中断深度为0
// SpiaRegs.SPIFFRX.all=0x204F; //使能FIFO接收;清除RXFIFO接收中断;禁止RX FIFO与RXFFIVL匹配中断;设置RX FIFO中断深度为16
// SpiaRegs.SPIFFCT.all=0x0; //设置FIFO发送延时为0
SpiaRegs.SPIBRR =0x007F; //设置通信波特率=LSPLCK/(SPIBRR+1)或LSPCLK/4:37.5M/128=292.9k
SpiaRegs.SPICCR.bit.SPISWRESET = 1; //从复位状态释放
SpiaRegs.SPIPRI.bit.FREE = 1; //自由运行
}
Uint16 SPIA_SendReciveData(Uint16 dat)
{
// Transmit data
SpiaRegs.SPITXBUF=dat;
// Wait until data is received
while(SpiaRegs.SPISTS.bit.INT_FLAG !=1);
DELAY_US(8);
return SpiaRegs.SPIRXBUF;
}