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.

TMS320F28335: 如何使用SPI实现一次一个字节数据的发送和接收?

Part Number: TMS320F28335


我希望使用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;
}