This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我希望使用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; }