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.
最近做的一个28335的板子,尝试进行主从机的spi通信,按照自发自收的例程以及网上查到的资料写了个循环通信的程序,发现不好使,然后尝试单次发送数据,主机发送C511等待从机接收。发现示波器上显示如下图,但是从机的RXBUF一直显示接收的全是高电平,我尝试了发送一位,八位,16位都是这样。
ps:从机在发送之前往TXBUF里写入了传输的数据
设置断点观察,FIFO的溢出中断标志位没有置位
目前程序中使用的是查询的方式,但之前也试过从机的接收中断,情况一样
虽然我暂时不想要从机数据,但是用示波器观察SOMI,通信过程中,一直处于高电平状态,无数据发送
发送八位数据时的寄存器值(在 that->u16RecvDataL_spi = SpiaRegs.SPIRXBUF 设置的中断)
主机相关程序
void SPI_DRIVE_init_ex(SPI_DRIVE *that){
//
// Initialize SPI FIFO registers
//
SpiaRegs.SPIFFTX.bit.TXFIFO=0;
SpiaRegs.SPIFFTX.all=0xE040; //使能FIFO;清除发送中断标志位; 禁止FIFO发送中断;发送中断级别定义为0
SpiaRegs.SPIFFRX.bit.RXFIFORESET=0;
SpiaRegs.SPIFFRX.all=0x204F; //清除FF溢出标志位;清除溢出接受中断标志位; 禁止FF接受中断;接受中断级别为16;
SpiaRegs.SPIFFCT.all=0x0; //SPITXBUF到移位寄存器传送不延迟;
// Initialize SPI registers
SpiaRegs.***.all =0x000F; // Reset on, rising edge, 16-bit char bits 软件复位进行寄存器更改 输入参数16位
//
// Enable master mode, normal phase, enable talk, and SPI int disabled.启用主机模式,正常相位,启用通话和禁用SPI int。
//
SpiaRegs.***.all =0x000A;//*** 从机保持设置 关闭溢出中断使能
SpiaRegs.SPIBRR =0x002F; //SPI波特率=LSPCLK/(SPIBRR+1)
SpiaRegs.***.all =0x0087; // Relinquish SPI from Reset输出极性 字符移入量
SpiaRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission 自由运行
}
void SPI_DRIVE_write_ex(SPI_DRIVE *that){
Uint16 u16RecvData_spi = 0;
Uint32 u32TimeCounter = 0;
that->u16SendDataL_spi=0x1234;
//while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG==1){}
SpiaRegs.SPITXBUF = that->u16SendDataL_spi; //传输前的写入
// DELAY_US(600);
//while (SpiaRegs.SPISTS.bit.INT_FLAG !=1){}
while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { }//spi的fifo存够
that->u16RecvDataL_spi = SpiaRegs.SPIRXBUF; //从输出缓存中读出 (读出数据为右对齐16位)
u16RecvData_spi = that->u16RecvDataL_spi;
// return u16RecvData_spi;
GPIO
主机
// ***
GpioCtrlRegs.GPBPUD.bit.GPIO57 = 0; // Enable pullup on GPIO57 (新增部分:双spi通信的片选信号 57口)
GpioDataRegs.GPBDAT.bit.GPIO57 = 1; // Load output latch
GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 0; // GPIO57 = GPIO57
GpioCtrlRegs.GPBDIR.bit.GPIO57 = 1; // GPIO32 = output
从机
// ***
GpioCtrlRegs.GPBPUD.bit.GPIO57 = 0; // Disable pullup on GPIO57 (新增部分:双spi通信的片选信号 57口)
GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 1; // GPIO57 = cs
GpioCtrlRegs.GPBQSEL2.bit.GPIO57 = 3; // Asynch input GPIO21 (SOMIA) 异步输入