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.

[参考译文] TMS320F2.8377万S:LIS3DSH的SPI通信问题

Guru**** 2484615 points
Other Parts Discussed in Thread: CONTROLSUITE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/620071/tms320f28377s-spi-communication-issues-with-lis3dsh

部件号:TMS320F2.8377万S
主题:controlSUITE中讨论的其他部件

大家好,

 正在尝试将TI TMS320F2.8377万 LaunchPad与LIS3DSH加速计连接起来,这是我 第一次使用这套硬件的实践经验。 我正在使用SPI-B 参考  controlSUITE中提供的示例,我编写了基本代码,并连接了逻辑分析器以观看通信。 代码执行,但我看不到通过SPI线路进行任何通信。 我不确定我的GPIO mux配置是否正确。 InitSysCtrl()将我的系统时钟设置为200MHz,而我的加速计在SPI线路上的工作频率为10MHz。 然后我只是尝试通过SPI-B传输一些测试数据 提前感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Anand:

    请注意,值6不是GPBMUX2.bit.GPIOxx的有效配置(此寄存器中任何特定GPIO的范围为0-3)。

    相反,您需要使用GPBMUX2和GPBGMUX2寄存器的组合来完全配置mux,因此对SPIB使用GPIO58-61。  

    有关详细信息,请参阅F2837xD TRM。
    http://www.ti.com/lit/spruhm8

    希望这能有所帮助!


    谢谢!
    Brett

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     Brett您好!

    我尝试 过GPBMUX2和GPBGMUX2的组合如下

    /*
    *@brief为LIS3DSH初始化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
    
    //配置组MUX
    gpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3;
    gpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3;
    gpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3;
    gpioCtrlRegs.GPBGMUX2.bit.GPIO61 = 3;
    
    //使用GPIO寄存器配置SPI-B引脚
    gpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3;//配置为SPI CLK B
    gpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3;//配置为SPI STE B
    gpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3;//配置为SPI SIMO B
    gpioCtrlRegs.GPBMUX2.bit.GPIO61 = 3;//配置为SPI SOMI B
    
    EDIS;
    } 

    但也不起作用。 为了进行测试,我切换到SPI-A,因为在controlSUITE 示例中提供了SPI-A的驱动程序。 我可以在我的逻辑分析器中看到一些通信通过SPI-A线路进行,但它无法转换。 请查找随附的屏幕截图。 我有来自加速计的SPI通信图,我正在尝试与它通信。 我只需要通过SPI总线读取和写入寄存器的能力。 以下是SPI-A的代码   

    //###################################################################
    //
    //文件:main.c
    ////#######################################################################################################################################################################################################################
    
    
    //包含的文件
    #include "F28x_Project.h"
    #include "F2837xS_Examples.h"
    
    //定义
    
    #define SPI_A 0x01
    
    
    //私有函数
    void SPI_A_GPIO _init(void);
    void SPI_A_init(void);
    
    /*
    @brief main函数
    *@param none
    *@return none
    */
    main void (void)
    {
    /*
    *初始化系统控制:
    * PLL,看门狗,启用外设时钟
    *此示例函数可在F2837xS_sysctrl.c文件中找到。
    */
    InitSysCtrl();
    
    //初始化GPIO:
    伊尼特·格皮奥();
    
    IF (SPI_A)
    {
    SPI_A_GPIO初始化();
    }
    
    /*
    *清除所有中断并初始化PIE矢量表:
    *禁用CPU中断
    */
    色调;
    
    /*
    *将PIE控制寄存器初始化为其默认状态。
    *默认状态为禁用所有PIE中断和标志
    *被清除。
    *此函数位于F2837xS_PIECTRL.c文件中。
    */
    InitPieCtrl();
    
    //禁用CPU中断并清除所有CPU中断标志:
    IER = 0x0000;
    IFR = 0x0000;
    
    /*
    *使用指向外壳中断的指针初始化PIE矢量表
    *服务例程(ISR)。
    *这将填充整个表,即使中断也是如此
    本例中不使用*。 这对于调试非常有用。
    * shell ISR例程可在F2837xS_DefaultIsr.C.中找到
    *此函数可在F2837xS_PieVect.C.中找到
    */
    InitPieVectorTable();
    
    //启用全局中断和更高优先级的实时调试事件:
    EINT;//启用全局中断INTM
    ERTM;//启用全局实时中断DBGM
    
    //初始化设备外围设备:
    IF (SPI_A)
    {
    SPI_A_INIT();
    
    SpiaRegs.SPITXBUF = 0x3F; //传输缓冲区
    
    While (SpiaRegs.SPISTS.bit.INT_flag !=1)
    {
    //等待直到字符被传输
    }
    
    SpiaRegs.SPITXBUF = 0x00; //传输缓冲区
    
    While (SpiaRegs.SPISTS.bit.INT_flag !=1)
    {
    //等待直到字符被传输
    }
    }
    
    return;
    }/*
    
    
    @brief为SD卡初始化SPI-A GPIO
    *@param none
    *@return none
    */
    void SPI_A_GPIO初始化(void)
    {
    EALLOW;
    
    //为所选引脚启用内部上拉
    GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0; //启用SPI SIMO A上的上拉
    GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0; //启用SPI SOMI A上的上拉
    GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0; //启用SPI CLK A上的上拉
    GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0; //启用SPI STE A上的上拉
    
    //将所选引脚的限定条件设置为仅异步
    GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3;//异步输入SPI SIMO A
    GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3;//异步输入SPI SOMI A
    GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3;//异步输入SPI CLK A
    GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3;//异步输入SPI STE A
    
    //使用GPIO寄存器配置SPI-A引脚
    gpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1;//配置为SPI SIMO A
    gpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1;//配置为SPI SOMI A
    gpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1;//配置为SPI CLK A
    gpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1;//配置为SPI STE A
    
    EDIS;
    }/*
    
    
    *@brief此函数将SPI-A初始化为已知状态
    *@param none
    *@return none
    */
    void SPI_A_init (void)
    {
    //在更改配置之前将重置设置为低
    SpiaRegs.SPICCR.bit.SPISWRESET =0;
    
    SpiaRegs.SPICCR.bit.CLKPOLARITY = 1;//时钟极性(1 ==下降)
    SpiaRegs.SPICCR.bit.SPICHAR =(16-1);// 16位字符
    
    SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;//启用Master (1 == MASTER)
    SpiaRegs.SPICTL.bit.Talk =1; //启用传输(Talk)
    SpiaRegs.SPICTL.bit.CLK_PHASE =1; //时钟相位(1 ==延迟)
    SpiaRegs.SPICTL.bit.SPIINTENA = 0; // SPI中断被禁用
    
    //设置波特率
    // CPU CLK频率= 200 MHz,SPI CLK频率= 1MHz
    // LSPCLK freq = CPU freq /4 (默认)
    // BRR =(LSPCLK频率/ SPI CLK频率)- 1
    SpiaRegs.SPIBRR.Bit.SPI_bit_rate =((200E6 / 4)/ 10E5)- 1;
    
    //在断点处停止不会停止SPI
    SpiaRegs.SPIPRI.Bit.free = 1; //设置可用位
    
    //从重置中释放SPI
    SpiaRegs.SPICCR.bit.SPISWRESET =1;
    }//
    
    
    文件结束
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Anand:

    请参阅数据表中标有'GPIO多路插针'的表格(当前为表4-3):
    http://www.ti.com/lit/gpn/tms320f2.8377万s

    此图将告诉您如何设置GPAMUX和GPAGMUX寄存器。  您编码的内容看起来不正确。


    谢谢!
    Brett

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嘿Brett,感谢您为我指出正确的事情。 我已了解该表并 使用正确配置了两个mux

    如果我在逻辑分析器上观察通信,我可以看到它正在尝试通信,如图所示。 但 我看不到我试图通过SPI发送的数据。

    此外,以下是更新的代码:

    //###################################################################
    //
    //文件:main.c
    ////#######################################################################################################################################################################################################################
    
    
    //包含的文件
    #include "F28x_Project.h"
    #include "F2837xS_Examples.h"
    
    //私有函数
    void SPI_b_gPIO_init(void);
    void SPI_b_init(void);
    
    /*
    @brief main函数
    *@param none
    *@return none
    */
    void main (void)
    {
    /*
    *初始化系统控制:
    * PLL,看门狗,启用外设时钟
    *此示例函数可在F2837xS_sysctrl.c文件中找到。
    */
    InitSysCtrl();
    
    //初始化GPIO:
    伊尼特·格皮奥();
    SPI_b_gPIO_init();
    
    
    /*
    *清除所有中断并初始化PIE矢量表:
    *禁用CPU中断
    */
    色调;
    
    /*
    *将PIE控制寄存器初始化为其默认状态。
    *默认状态为禁用所有PIE中断和标志
    *被清除。
    *此函数位于F2837xS_PIECTRL.c文件中。
    */
    InitPieCtrl();
    
    //禁用CPU中断并清除所有CPU中断标志:
    IER = 0x0000;
    IFR = 0x0000;
    
    /*
    *使用指向外壳中断的指针初始化PIE矢量表
    *服务例程(ISR)。
    *这将填充整个表,即使中断也是如此
    本例中不使用*。 这对于调试非常有用。
    * shell ISR例程可在F2837xS_DefaultIsr.C.中找到
    *此函数可在F2837xS_PieVect.C.中找到
    */
    InitPieVectorTable();
    
    //启用全局中断和更高优先级的实时调试事件:
    EINT;//启用全局中断INTM
    ERTM;//启用全局实时中断DBGM
    
    //初始化设备外围设备:
    SPI_b_init();
    
    SpibRegs.SPITXBUF = 0x3F; //传输缓冲区,注册地址
    
    While (SpibRegs.SPISTS.bit.INT_flag !=1)
    {
    //等待直到字符被传输
    }
    
    SpibRegs.SPITXBUF = 0x00; //传输缓冲区
    
    While (SpibRegs.SPISTS.bit.INT_flag !=1)
    {
    //等待直到字符被传输
    }
    
    return;
    }/*
    
    
    @brief为LIS3DSH初始化SPI-B GPIO
    *@param none
    *@return none
    */
    void SPI_b_GPIO初始化(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
    
    //配置组MUX
    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){
    
    //在更改配置之前将重置设置为低
    SpibRegs.SPICCR.bit.SPISWRESET =0;
    
    SpibRegs.SPICCR.bit.CLKPOLARITY = 1;//时钟极性(1 ==下降)
    SpibRegs.SPICCR.bit.SPICHAR =(16-1);// 16位字符
    
    SpibRegs.SPICTL.bit.MASTER_SLAVE = 1;//启用主中继器(1 ==主中继器)
    SpibRegs.SPICTL.Bit.Talk =1; //启用传输(Talk)
    SpibRegs.SPICTL.bit.CLK_PHASE =1; //时钟相位(1 ==延迟)
    SpibRegs.SPICTL.bit.SPIINTENA = 0; // SPI中断被禁用
    
    //设置波特率
    // CPU CLK频率= 200 MHz,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;
    }//
    
    文件结束
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Anand:

    我不能在您的项目中完全调试代码,您需要带头。  

    我的建议是尝试传输不同的数据值,以了解您是否可以理解SPI传输数据的原因。  这与F2837x TRM的SPI一章一起应有助于您进行调试。

    对于您正在进行的任何新SPI配置,您可能需要检查您写入SPI配置寄存器的值是否按您的想法写入-通过表达式/监视窗口。  这将帮助您检查您的未遇到任何十六进制,十进制,二进制转换问题,并捕获潜在的EALLOW/EDIS问题。


    谢谢!
    Brett

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Brett您好!

    我可以理解你们的调试限制。我尝试传输不同的值,它做了同样的事情。 我认为问题是CS线不是很低。 当通信开始时,微控制器将CS线路保持在低位,然后我传输第一个数据字节,即要读取的寄存器地址。 然后,我正在发送伪字节0x00,我可以为其读回数据。 但在CS之间,该线路保持高电压一段时间,这可能会重新启动SPI通信。 即使我尝试在通信开始时手动将CS线拉低,并在通信结束时将其拉高,它仍然具有相同的过渡。 对此有何想法?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Anand:

    如果您仅在另一个传输完成后写入新数据,CS (STE)将在之间高电压。  如果您在SPI中使用FIFO功能(并快速连续地将数据写入TXBUF),您将生成一个32位的连续组。  

    controlSUITE中的示例使用FIFO,应该是一个很好的参考:
    \controlSUITE\DEVICE_SUPPORT\F2837xS\v***\F2837xS_Examples_CPU1\SPI_loop\</s>2837


    谢谢!
    Brett