大家好、
我正在尝试将 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;
返回;
}
//文件结束

