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.

[参考译文] Starterware/AFE5809EVM:使用 SPI 连接进行 AFE5809EVM 初始化

Guru**** 2615265 points

Other Parts Discussed in Thread: AFE5809EVM, AFE5809

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

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/586885/starterware-afe5809evm-afe5809evm-initialization-using-spi-connection

器件型号:AFE5809EVM
主题中讨论的其他器件: TSW1400EVMAFE5809

工具/软件:Starterware

尊敬的朋友:

我一直在努力使用 OMAP L138 LCDK 的 SPI 模块来初始化 AFE5809EVM。 之前、我 已使用 AFE5809EVM GUI 成功初始化 AFE5809EVM 和 TSW1400EVM。 我决定在此处创建有关如何初始化 AFE5809EVM 的全面参考。 希望我们能解决这个问题、而这条线程将对未来的用户有益。

正如本主题(e2e.ti.com/.../576643)中建议的、我有:

  1. 首先、使用 AFE5809EVM GUI 启动 AFE5809EVM
  2. 第二、我已断开 AFE EVM 板上的 FB17 (在此阶段、AFE5809EVM 已由 GUI 成功初始化。 现在、我们断开 FB17、因此我们可以使用 P14引脚启动 SPI 连接。)
  3. 第三、我已将 OMAP L138 EVM 的 SPI 引脚连接到 AFE5809EVM 的 P14。
  4. 我测试是否可以通过 SPI 正确通信。 为此,我只需启用读出(通过设置寄存器00 =(值) 0x0002),然后读取寄存器04。
  5. 当我执行此测试时、我看不到 TP 12上的任何更改。

请验证以下陈述是否正确:

  • AFE5809EVM 的 SPI 使用高极性和异相时钟(图83。 afe5809的 SPI 时序)。 在代码中、我们需要此行中包含以下信息:

    SPIConfigClkFormat (SOC_SPI_1_regs、(SPI_CLK_POL_HIGH | SPI_CLK_OUTOFPHASE)、
    数据格式);

  • 为了初始化 AFE5809、我只需将 P14的 SCLK、SDATA、GND 和 SEN 引脚连接到 OMAP L138LCDK 的适当 SPI 引脚。 (我不需要连接以下任何引脚:PDN_GLOBAL、PDN_VCA、SPI_DIG_EN 或 AFE5809EVM P14上的任何其他引脚)

  • 此代码是 Starterware SPI 示例的修改版本。 代码是否正常?  
  • 请验证下面示波器上显示的 SPI 信号是否正常。

非常感谢您的观看。 我真的很感激:)

我的代码:

/**
*\file spi.c
*
\brief 这是一个调用某些 API
的示例应用文件* 从 SPI 器件抽象层执行配置
、* 传输和接收操作。
*/

*
*版权所有(C) 2012德州仪器(TI)公司- http://www.ti.com/
*

只要
符合以下条件*、就允许以源代码和二进制形式重新分发和使用*进行修改或不进行修改:
*
*源代码的重新分发必须保留上述版权
声明*、此条件列表和以下免责声明。
*
*二进制形式的再发行必须在

*
发行版随附的*文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
*
*未经

事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件派生的产品*。
*
*本软件由版权所有者和贡献者
*按原样"提供、

且不承认任何明示或暗示的保证、包括但不限于*特定用途*的适销性和适用性的暗示保证。 在任何情况下、版权
*所有者或贡献者都不对任何直接、间接、偶然、
*特殊、模范、 或相应的损害(包括但不
限于*采购替代产品或服务;丧失使用、
*数据或利润; 或业务中断)、但出于
任何*责任理论、无论是合同、严格责任还是侵权
行为*(包括疏忽或其他原因)、即使
被告知可能会造成此类损坏、也是出于此类责任理论。
*/

#include 
#include "SoC_OMAPL138.h"
#include "HW_PSC_OMAPL138.h"
#include "lcdkOMAPL138.h"
#include "UART.h"
#include "SPI.h"

#include "interrupt.h"
#include "uartStdio.h"

/*********
** 内部宏定义
//*
将 SMIO、SOMI、CLK 和 CS 引脚配置为功能引脚的值*/
#define SIMO_SOMI_CLK_CS 0x00000E01
#define char_length 0x8

/*********
** 内部函数原型
/
static void SPIConfigDataFmtReg (unsigned int dataFormat);
static void SpiTransfer (void);
static void SetUpInt (void);
static void SetUpSPI (void);
static void GetStatusCommand (void);
static void SendCommand (void);
void SPIIsr (void);

/*********
** 内部变量定义
/
volatile unsigned int flag = 1;
unsigned int TX_len;
unsigned int Rx_len;
unsigned char vrf_data[260];
unsigned char TX_DATA[260];
volatile unsigned char Rx_data[260];
unsigned char * p_TX;
volatile unsigned char * p_Rx;
volatile unsigned char StatusResponseMessage[16];

/
** 内部功能定义
/
int main (void)
{
/*唤醒 SPI1实例。 *
PSCModuleControl (SOC_PSC_1_regs、HW_PSC_SPI1、PSC_POWERDOMAIN_AYS_ON、
PSC_MDCTL_NEW_ENABLE);

/*为串行通信初始化 UART 实例。 //
// UARTStdioInit();
/*执行 SPI1的引脚复用。 *
SPIPinMuxSetup (1);

/*
**使用 SPI1的芯片选择(CS) 0引脚与指纹传感器通信。
*
SPI1CSPinMuxSetup (0);

/*启用 SPI1中断的使用。 *
SetUpInt();

/*配置和启用 SPI1实例。 *
SetUpSPI();

while (1)
{
SendCommand();
printf ("已发送");

}

}

静态 void SendCommand (void)
{
//发出命令启用 TP12的读出
TX_DATA[0]= 0x00;
TX_DATA[0]= 0x00;
TX_DATA[0]= 0x02;

TX_LEN = 3;
RX_LEN = 3;

SPIDat1Config (SOC_SPI_1_regs、(SPI_CSHOLD | SPI_DATA_FORMAT0)、0x01);
SpiTransfer();

int i = 0;
while (I < 10000)
{
i++;
}

//发出命令读取寄存器04
TX_DATA[0]= 0x04;
TX_DATA[0]= 0x00;
TX_DATA[0]= 0x18;

TX_LEN = 3;
RX_LEN = 3;

SPIDat1Config (SOC_SPI_1_regs、(SPI_CSHOLD | SPI_DATA_FORMAT0)、0x01);
SpiTransfer();

}//**


将 ARM 中断控制器配置为生成 SPI 中断
**
*/
STATIC void SetUpInt(void){

//设置 ARM 或 DSP 中断控制

器#ifdef _TMS320C6x
//初始化 DSP 中断控制器
IntDSPINTCMINIT();

//在矢量表中注册 ISR
IntRegister (C674x_MASK_INT4、SPIIsr);

//将系统中断映射到 DSP 可屏蔽中断
IntEventMap (C674x_MASK_INT4、SYS_INT_SPI1_INT);

//启用 DSP 可屏蔽中断
IntEnable (C674x_MASK_INT4);

//全局启用 DSP 中断
IntGlobalEnable();
#else
/*初始化 ARM 中断控制器。*/
IntAINTCInit();

/*在中断矢量表中注册 ISR。*/
内部寄存器(SYS_INT_SPINT1、SPIIsr);

/*为系统中断56设置 AINTC 的通道编号2。
*通道2被映射到 ARM9的 IRQ 中断。
*
IntChannelSet (SYS_INT_SPINT1、2);

/*为 AINTC 启用系统中断。*/
IntSystemEnable (SYS_INT_SPINT1);

/*在 CPSR 中启用 IRQ。*/
IntMasterIRQEnable();

/*在 AINTC 的 GER 中启用中断。*/
IntGlobalEnable();

/*在 AINTC 的 HIER 中启用中断。*/
IntIRQEnable();
#endif
}

/*
**配置 SPI 控制器
**
*/
static void SetUpSPI (void)
{
unsigned char cs = 0x01;//警告:更改后、也会在 SpiTransfer 中更改0x01
unsigned char dcs = 0x01;
unsigned int val = SIMO_SOMI_CLK_CS;
SPIReset (SOC_SPI_1_regs);

SPIOutOfReset (SOC_SPI_1_regs);

SPIModeConfigure (SOC_SPI_1_regs、SPI_MASTER_MODE);

//SPIClkConfigure (SOC_SPI_1_regs、150000000、20000000、SPI_DATA_FORMAT0);
SPIClkConfigure (SOC_SPI_1_regs、150000000、1000000、SPI_DATA_FORMAT0);

SPIPinControl (SOC_SPI_1_regs、0、0、&val);

SPIDefaultCSSet (SOC_SPI_1_regs、dcs);

/*配置 SPI 数据格式寄存器*/
SPIConfigDataFmtReg (SPI_DATA_FORMAT0);

/*选择要使用的 SPI 数据格式寄存器并设置 CSHOLD
*将 CS 引脚置为有效(LINE)
*
SPIDat1Config (SOC_SPI_1_regs、(SPI_CSHOLD | SPI_DATA_FORMAT0)、cs);

/*将中断映射到中断线路 INT1 */
SPIIntLevelSet (SOC_SPI_1_regs、SPI_RECV_INTLVL | SPI_Transmit _INTLVL);

/*启用 SPI 通信*/
SPIEnable (SOC_SPI_1_regs);
}
//
***配置 SPI 的数据格式寄存器
**
*
静态空 SPIConfigDataFmtReg (unsigned int dataFormat)
{
/*配置 SPI 时钟的极性和相位*/
/*
SPIConfigClkFormat (SOC_SPI_1_regs、
(SPI_CLK_POL_HIGH | SPI_CLK_INPHASE)、
数据格式);
*
SPIConfigClkFormat (SOC_SPI_1_regs、(SPI_CLK_POL_HIGH | SPI_CLK_OUTOFPHASE)、
数据格式);

/*将 SPI 配置为在数据传输期间首先发送 MSB 位*/
SPIShiftMsbFirst (SOC_SPI_1_regs、dataFormat);

/*设置字符长度*/
SPICharLengthSet (SOC_SPI_1_regs、char_length、dataFormat);
}

//
***启用 SPI 发送和接收中断。
**断言芯片选择线路。
*/
静态 void SpiTransfer (void)
{

P_TX =&TX_DATA[0];
P_Rx =&Rx_DATA[0];
SPIIntEnable (SOC_SPI_1_regs、(SPI_RECV_INT | SPI_Transmit _INT));
while (标志)
;
FLAG = 1;
/*断言 CS 引脚(LINE)*/
SPIDat1Config (SOC_SPI_1_regs、SPI_DATA_FORMAT0、0x01);// cs Value
}

//
***数据传输和接收 SPIIsr
**
*/
void SPIIsr (void)
{
unsigned int 代码= 0;

#ifdef _TMS320C6x
IntEventClear (SYS_INT_SPI1_INT);
#else
IntSystemStatusClear (56);
#endif

intCode = SPIInterruptVectorGet (SOC_SPI_1_regs);

while (intCode)
{
if (intCode = SPI_TX_BUF_EMPTY)
{
TX_LEN --;
SPITransmitData1 (SOC_SPI_1_regs、* p_tx);
P_TX++;
如果(!TX_Len)
{
SPIIntDisable (SOC_SPI_1_regs、SPI_Transmit _INT);
}
}

if (intCode = SPI_RECV_FULL)
{
RX_LEN --;
* p_rx =(char) SPIDataReceive (SOC_SPI_1_regs);
P_RX++;
如果(!rx_len)
{
标志= 0;
SPIIntDisable (SOC_SPI_1_regs、SPI_RECV_INT);
}
}

intCode = SPIInterruptVectorGet (SOC_SPI_1_regs);
}
}

/********* 文件结尾 /

这是整个系统:

以下是 OMAP L138 LCDK 的 SPI1模块的输出:

PIC。 1:SDATA 和 ENA

PIC。 2:SCLK 和 ENA

PIC。 3:SCLK 的关闭视图

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    更新:
    我自己解决了这个问题。
    将来的用户、如果需要帮助、请给我发短信。
    谢谢:)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Sajad、

    我很高兴听到您解决了这个问题。 您可以随时发布该解决方案、以便 OMAP L138的未来用户知道该怎么办。

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

    以下是使用 OMAP L138 LCDK 初始化 AFE5809 EVM 的工作代码:

    /**
    *\file spi.c
    *
    \brief 这是一个调用某些 API
    的示例应用文件* 从 SPI 器件抽象层执行配置
    、* 传输和接收操作。
    */
    
    *
    *版权所有(C) 2012德州仪器(TI)公司- http://www.ti.com/
    *
    
    只要
    符合以下条件*、就允许以源代码和二进制形式重新分发和使用*进行修改或不进行修改:
    *
    *源代码的重新分发必须保留上述版权
    声明*、此条件列表和以下免责声明。
    *
    *二进制形式的再发行必须在
    
    *
    发行版随附的*文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
    *
    *未经
    
    事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件派生的产品*。
    *
    *本软件由版权所有者和贡献者
    *按原样"提供、
    
    且不承认任何明示或暗示的保证、包括但不限于*特定用途*的适销性和适用性的暗示保证。 在任何情况下、版权
    *所有者或贡献者都不对任何直接、间接、偶然、
    *特殊、模范、 或相应的损害(包括但不
    限于*采购替代产品或服务;丧失使用、
    *数据或利润; 或业务中断)、但出于
    任何*责任理论、无论是合同、严格责任还是侵权
    行为*(包括疏忽或其他原因)、即使
    被告知可能会造成此类损坏、也是出于此类责任理论。
    */
    
    #include 
    #include "SoC_OMAPL138.h"
    #include "HW_PSC_OMAPL138.h"
    #include "lcdkOMAPL138.h"
    #include "UART.h"
    #include "SPI.h"
    
    #include "interrupt.h"
    #include "uartStdio.h"
    
    /*********
    ** 内部宏定义
    //*
    将 SMIO、SOMI、CLK 和 CS 引脚配置为功能引脚的值*/
    #define SIMO_SOMI_CLK_CS 0x00000E01
    #define char_length 0x8 //默认8
    
    /*********
    ** 内部函数原型
    /
    static void SPIConfigDataFmtReg (unsigned int dataFormat);
    static void SpiTransfer (void);
    static void SetUpInt (void);
    static void SetUpSPI (void);
    static void GetStatusCommand (void);
    static void SendCommand (void);
    void SPIIsr (void);
    
    /*********
    ** 内部变量定义
    /
    volatile unsigned int flag = 1;
    unsigned int TX_len;
    unsigned int Rx_len;
    unsigned char vrf_data[260];
    unsigned char TX_DATA[260];
    volatile unsigned char Rx_data[260];
    unsigned char * p_TX;
    volatile unsigned char * p_Rx;
    volatile unsigned char StatusResponseMessage[16];
    volatile unsigned char cs = 0x01;
    volatile unsigned char DCs = 0x01;
    
    /*********
    ** 内部功能定义
    /
    int main (void)
    {
    /*唤醒 SPI1实例。 *
    PSCModuleControl (SOC_PSC_1_regs、HW_PSC_SPI1、PSC_POWERDOMAIN_AYS_ON、
    PSC_MDCTL_NEW_ENABLE);
    
    /*为串行通信初始化 UART 实例。 //
    // UARTStdioInit();
    /*执行 SPI1的引脚复用。 *
    SPIPinMuxSetup (1);
    
    /*
    **使用 SPI1的芯片选择(CS) 0引脚与指纹传感器通信。
    *
    SPI1CSPinMuxSetup (0);
    
    /*启用 SPI1中断的使用。 *
    SetUpInt();
    
    /*配置和启用 SPI1实例。 *
    SetUpSPI();
    
    SendCommand();
    printf ("sent \n");
    
    }
    
    静态 void SendCommand (void)
    {
    //发出命令
    TX_DATA[0]= 0x00;//复位
    TX_DATA[1]= 0x00;
    TX_DATA[2]= 0x01;
    
    TX_LEN = 3;
    RX_LEN = 3;
    
    SPIDat1Config (SOC_SPI_1_regs、(SPI_CSHOLD | SPI_DATA_FORMAT0)、cs);
    SpiTransfer();
    
    int i = 0;
    while (I < 1000000)
    i++;
    
    //发出命令
    TX_DATA[0]= 0x16;//禁用 DEMOD
    TX_DATA[1]= 0x00;
    TX_DATA[2]= 0x01;
    
    TX_LEN = 3;
    RX_LEN = 3;
    
    SPIDat1Config (SOC_SPI_1_regs、(SPI_CSHOLD | SPI_DATA_FORMAT0)、cs);
    SpiTransfer();
    
    I = 0;
    while (I < 1000000)
    i++;
    
    //发出命令
    TX_DATA[0]= 0x04;//????
    TX_DATA[1]= 0x00;
    TX_DATA[2]= 0x18;
    
    TX_LEN = 3;
    RX_LEN = 3;
    
    SPIDat1Config (SOC_SPI_1_regs、(SPI_CSHOLD | SPI_DATA_FORMAT0)、cs);
    SpiTransfer();
    
    I = 0;
    while (I < 1000000)
    i++;
    
    //发出命令
    TX_DATA[0]= 0x02;//设置切换信号
    TX_DATA[1]= 0xA0;
    TX_DATA[2]= 0x00;
    
    TX_LEN = 3;
    RX_LEN = 3;
    
    SPIDat1Config (SOC_SPI_1_regs、(SPI_CSHOLD | SPI_DATA_FORMAT0)、cs);
    SpiTransfer();
    
    I = 0;
    while (I < 1000000)
    i++;
    }
    
    /*
    **将 ARM 中断控制器配置为生成 SPI 中断
    **
    */
    STATIC void SetUpInt(void){
    
    //设置 ARM 或 DSP 中断控制
    
    器#ifdef _TMS320C6x
    //初始化 DSP 中断控制器
    IntDSPINTCMINIT();
    
    //在矢量表中注册 ISR
    IntRegister (C674x_MASK_INT4、SPIIsr);
    
    //将系统中断映射到 DSP 可屏蔽中断
    IntEventMap (C674x_MASK_INT4、SYS_INT_SPI1_INT);
    
    //启用 DSP 可屏蔽中断
    IntEnable (C674x_MASK_INT4);
    
    //全局启用 DSP 中断
    IntGlobalEnable();
    #else
    /*初始化 ARM 中断控制器。*/
    IntAINTCInit();
    
    /*在中断矢量表中注册 ISR。*/
    内部寄存器(SYS_INT_SPINT1、SPIIsr);
    
    /*为系统中断56设置 AINTC 的通道编号2。
    *通道2被映射到 ARM9的 IRQ 中断。
    *
    IntChannelSet (SYS_INT_SPINT1、2);
    
    /*为 AINTC 启用系统中断。*/
    IntSystemEnable (SYS_INT_SPINT1);
    
    /*在 CPSR 中启用 IRQ。*/
    IntMasterIRQEnable();
    
    /*在 AINTC 的 GER 中启用中断。*/
    IntGlobalEnable();
    
    /*在 AINTC 的 HIER 中启用中断。*/
    IntIRQEnable();
    #endif
    }
    
    /*
    **配置 SPI 控制器
    **
    */
    static void SetUpSPI (void)
    {
    unsigned int val = SIMO_SOMI_CLK_CS;
    SPIReset (SOC_SPI_1_regs);
    
    SPIOutOfReset (SOC_SPI_1_regs);
    
    SPIModeConfigure (SOC_SPI_1_regs、SPI_MASTER_MODE);
    
    //SPIClkConfigure (SOC_SPI_1_regs、150000000、20000000、SPI_DATA_FORMAT0);
    SPIClkConfigure (SOC_SPI_1_regs、150000000、1000、SPI_DATA_FORMAT0);
    
    SPIPinControl (SOC_SPI_1_regs、0、0、&val);
    
    SPIDefaultCSSet (SOC_SPI_1_regs、dcs);
    
    /*配置 SPI 数据格式寄存器*/
    SPIConfigDataFmtReg (SPI_DATA_FORMAT0);
    
    /*选择要使用的 SPI 数据格式寄存器并设置 CSHOLD
    *将 CS 引脚置为有效(LINE)
    *
    SPIDat1Config (SOC_SPI_1_regs、(SPI_CSHOLD | SPI_DATA_FORMAT0)、cs);
    
    /*将中断映射到中断线路 INT1 */
    SPIIntLevelSet (SOC_SPI_1_regs、SPI_RECV_INTLVL | SPI_Transmit _INTLVL);
    
    /*启用 SPI 通信*/
    SPIEnable (SOC_SPI_1_regs);
    }
    //
    ***配置 SPI 的数据格式寄存器
    **
    *
    静态空 SPIConfigDataFmtReg (unsigned int dataFormat)
    {
    /*配置 SPI 时钟的极性和相位*/
    /*
    SPIConfigClkFormat (SOC_SPI_1_regs、
    (SPI_CLK_POL_HIGH | SPI_CLK_INPHASE)、
    数据格式);
    *
    SPIConfigClkFormat (SOC_SPI_1_regs、(SPI_CLK_POL_HIGH | SPI_CLK_OUTOFPHASE)、
    数据格式);
    
    /*将 SPI 配置为在数据传输期间首先发送 MSB 位*/
    SPIShiftMsbFirst (SOC_SPI_1_regs、dataFormat);
    
    /*设置字符长度*/
    SPICharLengthSet (SOC_SPI_1_regs、char_length、dataFormat);
    }
    
    //
    ***启用 SPI 发送和接收中断。
    **断言芯片选择线路。
    */
    静态 void SpiTransfer (void)
    {
    
    P_TX =&TX_DATA[0];
    P_Rx =&Rx_DATA[0];
    SPIIntEnable (SOC_SPI_1_regs、(SPI_RECV_INT | SPI_Transmit _INT));
    while (标志)
    ;
    FLAG = 1;
    /*断言 CS 引脚(LINE)*/
    SPIDat1Config (SOC_SPI_1_regs、SPI_DATA_FORMAT0、cs);// cs Value
    }
    
    //
    ***数据传输和接收 SPIIsr
    **
    */
    void SPIIsr (void)
    {
    unsigned int 代码= 0;
    
    #ifdef _TMS320C6x
    IntEventClear (SYS_INT_SPI1_INT);
    #else
    IntSystemStatusClear (56);
    #endif
    
    intCode = SPIInterruptVectorGet (SOC_SPI_1_regs);
    
    while (intCode)
    {
    if (intCode = SPI_TX_BUF_EMPTY)
    {
    TX_LEN --;
    SPITransmitData1 (SOC_SPI_1_regs、* p_tx);
    P_TX++;
    如果(!TX_Len)
    {
    SPIIntDisable (SOC_SPI_1_regs、SPI_Transmit _INT);
    }
    }
    
    if (intCode = SPI_RECV_FULL)
    {
    RX_LEN --;
    * p_rx =(char) SPIDataReceive (SOC_SPI_1_regs);
    P_RX++;
    如果(!rx_len)
    {
    标志= 0;
    SPIIntDisable (SOC_SPI_1_regs、SPI_RECV_INT);
    }
    }
    
    intCode = SPIInterruptVectorGet (SOC_SPI_1_regs);
    }
    }
    
    /********* 文件结尾 /