最近做的一个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) 异步输入
li broune:
从机波特率和主机一样,上面的程序是我之前验证一个想法时改的。
,
Green Deng:
你好,不知道这块板子运行其他程序有没有异常?能否排除硬件上的问题?
,
li broune:
不好意思,这几天板子不在我这,硬件是公司那边设计的,板子运行其他程序没有问题,我之前还用mcbsp配了spi通信正常
,
li broune:
换了个示波器,发现了一些问题,MOSI信号电压在0.5V左右,会不会是这里的问题
,
li broune:
不好意思,问题已经解决了,是硬件的问题,硬件设计把simo和somi的先接反了。接正确后,从机能够正确接收主机信号了
,
Green Deng:
抱歉漏回了,感谢你的反馈。