大家好、
我正在尝试将 TI TMS320F28377 LaunchPad 与加速计相连接、这是我 在这组硬件上的第一次实践经验。 我使用的是 SPI-B 参考 controlSUITE 中给出的示例、我编写了基本代码、并连接了逻辑分析仪以观察通信。 代码会执行、我可以看到正在进行通信。 但逻辑分析仪无法为我解码通信。 InitSysCtrl()将我的系统时钟设置为200MHz,而我的加速计在 SPI 线路上运行为10MHz。 然后、我尝试通过 SPI-B 传输一些测试数据 我不确定是否使用 FIFO。 提前感谢。
//###################################################################################################################### // ////文件:main.c // ////############################################################################################################ //包含的文件 #include #include "F28x_Project.h" #include "F2837xS_Examples.h" //定义 #define SPI_TIMEOUT 1000 //* @简要初始化加速计的 SPI-B GPIO *@param none *@return none */ void SPI_b_GPIO_init (void) { EALLOW; //为所选引脚启用内部上拉 GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;//启用 SPI CLK B 上的上拉 GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;//启用 SPI STE B 上的上拉 GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;//启用 SPI SIMO B 上的上拉 GpioCtrlRegs.GPBPUD.bit.GPIO61 = 0;//启用 SPI SOMI B 上的上拉 //仅将所选引脚的限定条件设置为异步 GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;//异步输入 SPI CLK B GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3;//异步输入 SPI STE B GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3;//异步输入 SPI SIMO B GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3;//异步输入 SPI SOMI B //配置组多路复用器 GpioCtrlRegs.GPBGMUX2.bit.GPIO58=1; GpioCtrlRegs.GPBGMUX2.bit.GPIO59=1; GpioCtrlRegs.GPBGMUX2.bit.GPIO60=1; GpioCtrlRegs.GPBGMUX2.bit.GPIO61=1; //使用 GPIO 寄存器配置 SPI-B 引脚 GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 2;//配置为 SPI CLK B GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 2;//配置为 SPI STE B GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 2;//配置为 SPI SIMO B GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 2;//配置为 SPI SOMI B EDIS; } // *@ @brief 此函数会将 SPI-B 初始化为已知状态*@param none * return none */ void SPI_b_init (void) { //在配置更改之前将 RESET 设置为低电平 SpibRegs.SPICCR.bit.SPISWRESET = 0; SpibRegs.SPICCR.bit.CLKPOLARITY = 1;//时钟极性(1 =下降) SpibRegs.SPICCR.bit.SPICHAR =(8-1);// 8位字符 SpibRegs.SPICTL.bit.CLK_PHASE = 1; //时钟相位(1 =延迟) SpibRegs.SPICTL.bit.MASTER_SLAVE = 1;//启用主设备(1 =主设备) SpibRegs.SPICTL.bit.TALK = 1; //启用传输(TALK) SpibRegs.SPICTL.bit.SPIINTENA=0; //禁用 SPI 中断 //设置波特率 // CPU CLK 频率= 200MHz、SPI CLK 频率= 1MHz // LSPCLK freq = CPU freq /4 (缺省情况下) // BRR =(LSPCLK 频率/SPI CLK 频率)- 1. SpibRegs.SPIBRR.bit.SPI_BIT_RATE =((200E6 / 4)/ 10E5)- 1; //在断点上停止不会停止 SPI SpibRegs.SPIPRI.bit.FREE = 1; //设置空闲位 //解除 SPI 复位 SpibRegs.SPICCR.bit.SPISWRESET = 1; } // *@简要主函数 *@param none *@return none */ void main (void) { /* *初始化系统控制: * PLL、看门狗、启用外设时钟 *此示例函数位于 F2837xS_SYSCTRL.c 文件中。 * InitSysCtrl(); //初始化 GPIO: InitGpio(); spi_b_gpio_init (); /* *清除所有中断并初始化 PIE 矢量表: *禁用 CPU 中断 * Dint; /* *将 PIE 控制寄存器初始化为默认状态。 *默认状态为禁用所有 PIE 中断和标志 *被清除。 *此函数位于 F2837xS_PIECTRL.c 文件中。 * InitPieCtrl(); //禁用 CPU 中断并清除所有 CPU 中断标志: IER = 0x0000; IFR = 0x0000; /* *使用指向 shell 中断的指针初始化 PIE 矢量表 *服务例程(ISR)。 *这将填充整个表、即使是中断也是如此 本示例中未使用*。 这对于调试很有用。 * shell ISR 例程位于 F2837xS_DefaultIsr.c 中 *此函数位于 F2837xS_PieVect.c 中 * InitPieVectTable(); //启用全局中断和更高优先级的实时调试事件: EINT;//启用全局中断 INTM ERTM;//启用全局实时中断 DBGM //初始化设备外设: spi_b_init (); UINT16 SPI_TIMEOUT = SPI_TIMEOUT; SpibRegs.SPITXBUF = 0x0F | 0x80; //发送缓冲器 while ((SpibRegs.SPISTS.bit.INT_flag!= 1)&&(SPI_TIMEOUT > 0U)) { //等待字符已传输 SPI_TIMEOUT--; } if (SPI_TIMEOUT = 0U) { PUT ("SPI_TIMEOUT 1\n"); } SPI_TIMEOUT = SPI_TIMEOUT; SpibRegs.SPITXBUF = 0x00; //发送缓冲器 while ((SpibRegs.SPISTS.bit.INT_flag!= 1)&&(SPI_TIMEOUT > 0U)) { //等待字符已传输 SPI_TIMEOUT--; } uint16 RDATA = SpibRegs.SPIRXBUF; 返回; } //文件结束