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/TMS320C6748:如何在 C6748 Starterware 的 SPI1示例中将 CS1更改为 cs0? 到目前为止无法正常工作。

Guru**** 2609955 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/583574/starterware-tms320c6748-how-can-i-change-cs1-to-cs0-in-spi1-example-in-c6748-starterware-so-far-not-working

器件型号:TMS320C6748

工具/软件:Starterware

我在 C6748 Starterware SPI 示例中将 CS2更改为 CS0。 但是、我没有通过示波器看到任何 CS0信号。 此代码会出现什么问题。 有什么想法吗? 该电路板是根据 C6748 LCDK 定制的、CS0直接连接到 DSP。

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

/*
*版权所有(C) 2012德州仪器(TI)公司- http://www.ti.com/
*
* 以源代码和二进制形式重新分发和使用、有无
* 如果满足以下条件、则允许进行修改
符合*:  
*
*   源代码的重新分发必须保留上述版权
*   注意、此条件列表和以下免责声明。
*
*   二进制形式的再发行必须复制上述版权
*   请注意、中的此条件列表和以下免责声明
*   随提供的文档和/或其他材料   
   *分发。
*
*   德州仪器公司的名称和名称均不相同
*   其贡献者可用于认可或推广衍生产品
*   未经特定的事先书面许可。
*
* 本软件由版权所有者和贡献者提供
* "按原样"以及任何明示或暗示的保证、包括但不包括
* 仅限于对适销性和适用性的暗示保证
* 一项特定目的不予承认。 在任何情况下、版权均不得
* 所有者或贡献者应对任何直接、间接、偶然或
* 特殊、惩戒性或后果性损害(包括但不包括)
* 仅限于采购替代货物或服务;丧失使用、
* 数据或利润;或业务中断)
* 责任理论、无论是合同责任、严格责任还是侵权行为
* (包括疏忽或其他)因使用而以任何方式产生
* 、即使被告知可能会发生此类损坏。
*

#include
#include "SoC_C6748.h"
#include "HW_PSC_C6748.h"
#include "lcdkC6748.h"
#include "UART.h"
#include "spi.h"
#include "psc.h"
#include "interrupt.h"
#include "uartStdio.h"

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

/*********
**                     内部函数原型
秘书长的报告 /
静态空 SPIConfigDataFmtReg (unsigned int dataFormat);
//静态空 SpiTransfer (void);
静态空 SetUpInt(void);
静态空 SetUpSPI (空);
静态空 GetStatusCommand (空);
静态空 ResetCommand (空);
void SPIIsr (void);
void delay (volatile unsigned int delay);
静态空 TX_Command (空);

/*********
**                     内部变量定义
秘书长的报告 /
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;
unsigned short *p16_TX;
unsigned short *p16_rx;
无符号 short tx16_data[260];
unsigned short rx16_data[260];

volatile unsigned char StatusResponseMessage[16];

/*********
**                     内部函数定义
秘书长的报告 /
int main (空)

   /*唤醒 SPI1实例。 *
   PSCModuleControl (SOC_PSC_0_regs、HW_PSC_SPI0、PSC_POWERDOMAIN_AYS_ON、
                    PSC_MDCTL_NEW_ENABLE);

   /*为串行通信初始化 UART 实例。 *
   UARTStdioInit();

   UARTPuts ("欢迎使用 StarterWare SPI 应用程序。\r\n\r\n、-1);
   UARTPuts ("在此情况下、SoC 上的 SPI 控制器与之通信"、-1);
   UARTPuts (" LCDK 上存在指纹传感器。\r\n\r\n、-1);

   /*执行 SPI1的引脚复用。 *
   SPIPinMuxSetup (1);

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

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

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

   /*对指纹传感器发出重置*/
//   ResetCommand();

   TX_Command();

// UARTPuts ("正在尝试重置指纹传感器。\r\n\r\n"、-1);
   SPITransmitData1 (SOC_SPI_0_regs、tx16_DATA[0]);
   printf ("发送的数据[0]为%x\n"、tx16_data[0]);
//   延迟(10000000);
   SPITransmitData1 (SOC_SPI_0_regs、tx16_DATA[1]);
   printf ("发送的数据[1]为%x\n"、tx16_data[1]);
//   延迟(10000000);
   SPITransmitData1 (SOC_SPI_0_regs、tx16_DATA[0]);
   printf ("发送的数据[0]为%x\n"、tx16_data[0]);
//   延迟(10000000);
   SPITransmitData1 (SOC_SPI_0_regs、tx16_DATA[2]);
   printf ("发送的数据[2]为%x\n"、tx16_data[2]);
//   延迟(10000000);
   while (1)
   {
       SPITransmitData1 (SOC_SPI_0_regs、tx16_DATA[0]);
       printf ("发送的数据[0]为%x\n"、tx16_data[0]);
//       延迟(10000000);
       SPITransmitData1 (SOC_SPI_0_regs、tx16_DATA[3]);
       printf ("发送的数据[3]为%x\n"、tx16_data[3]);
//       延迟(10000000);
   }

   /*读取指纹传感器的状态*/
   /*
   GetStatusCommand();
   if (StatusResponse Message[11]=0x48)
   {
       UARTPuts ("指纹传感器已成功重置。\r\n\r\n、-1);
   }
   其他
   {
       UARTPuts ("错误:指纹传感器重置尝试失败。\r\n\r\n、-1);
   }
   *

静态空 TX_Command (空)

 //命令列表
 TX16_DATA[0]= 0x8001;//选择 REG01
 TX16_DATA[1]= 0x0001;//设置软件复位
 TX16_DATA[2]= 0x0000;//复位软件复位
 TX16_DATA[3]= 0x0080;//将显示设置为打开

静态空 GetStatusCommand (空)

 unsigned int i;

 //发出获取状态命令和读取状态消息响应
 TX_DATA[0]= 0x80;
 TX_DATA[1]= 0x10;
 TX_DATA[2]= 0xBA;
 TX_DATA[3]= 0x07;
 TX_DATA[4]= 0x00;
 TX_DATA[5]= 0x00;
 TX_DATA[6]= 0x00;
 TX_DATA[7]= 0xFF;
 TX_DATA[8]= 0xFF;
 TX_DATA[9]= 0xFF;
 TX_DATA[10]= 0xFF;
 TX_DATA[11]= 0xFF;
 TX_DATA[12]= 0xFF;
 TX_DATA[13]= 0xFF;
 TX_DATA[14]= 0xFF;
 TX_DATA[15]= 0xFF;
 TX_DATA[16]= 0xFF;
 TX_DATA[17]= 0xFF;
 TX_DATA[18]= 0xFF;
 TX_DATA[19]= 0xFF;
 TX_DATA[20]= 0xFF;
 TX_DATA[21]= 0xFF;
 TX_DATA[22]= 0xFF;
 TX_LEN = 23;
 RX_LEN = 23;

 SPIDat1Config (SOC_SPI_0_regs、(SPI_CSHOLD | SPI_DATA_FORMAT0)、0x1);
   SpiTransfer();

   for (i=0;i<16;i++)
   {
    StatusResponse Message[i]= RX_DATA[i+7];
   }

静态空 ResetCommand (空)

 //发出重置命令
 TX_DATA[0]= 0x80;
 TX_DATA[1]= 0x14;
 TX_DATA[2]= 0xBA;
 TX_DATA[3]= 0x07;
 TX_DATA[4]= 0x00;
 TX_DATA[5]= 0x00;
 TX_DATA[6]= 0x00;

 TX_LEN = 7;
 RX_LEN = 7;

 SPIDat1Config (SOC_SPI_0_regs、(SPI_CSHOLD | SPI_DATA_FORMAT0)、0x1);
   SpiTransfer();

/*
**将 ARM 中断控制器配置为生成 SPI 中断
**
*
静态空 SetUpInt (空)

 //设置 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();
其他
   /*初始化 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 控制器
**
*
静态空 SetUpSPI (空)

   unsigned char cs = 0x01;
   unsigned char dcs = 0x01;
   unsigned int val = SIMO_SOMI_CLK_CS;
   SPIReset (SOC_SPI_0_regs);

   SPIOutOfReset (SOC_SPI_0_regs);

   SPIModeConfigure (SOC_SPI_0_regs、SPI_MASTER_MODE);

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

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

   SPIDefaultCSSet (SOC_SPI_0_regs、dcs);

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

    /*将中断映射到中断线路 INT1 */
   SPIIntLevelSet (SOC_SPI_0_regs、SPI_RECV_INTLVL | SPI_Transmit _INTLVL);
   
   /*启用 SPI 通信*/
   SPIEnable (SOC_SPI_0_regs);

/*
**配置 SPI 的数据格式寄存器
**
*
静态空 SPIConfigDataFmtReg (无符号整型数据格式)

   /*配置 SPI 时钟的极性和相位*/

 SPIConfigClkFormat (SOC_SPI_0_regs、
                      (SPI_CLK_POL_HIGH | SPI_CLK_INPHASE)、
                      数据格式);

 /*
   SPIConfigClkFormat (SOC_SPI_0_regs、
                      (SPI_CLK_POL_LOW | SPI_CLK_INPHASE)、
                      数据格式);
   *

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

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

/*
**启用 SPI 发送和接收中断。
**断言芯片选择线路。
*


静态空 SpiTransfer (空)

   P_TX =&TX_DATA[0];
   P_Rx =&Rx_DATA[0];
   SPIIntEnable (SOC_SPI_0_regs、(SPI_RECV_INT | SPI_Transmit _INT);
   while (flag);
   FLAG = 1;
   /*断言 CS 引脚(LINE)*/
   SPIDat1Config (SOC_SPI_0_regs、SPI_DATA_FORMAT0、0x1);

/*
**数据传输和接收 SPIIsr
**
*
空 SPIIsr (空)

   unsigned int 代码= 0;

#ifdef _TMS320C6x
   IntEventClear (SYS_INT_SPI1_INT);
其他
   IntSystemStatusClear (56);
#endif

   intCode = SPIInterruptVectorGet (SOC_SPI_0_regs);

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

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

       intCode = SPIInterruptVectorGet (SOC_SPI_0_regs);
   }

/*延迟功能*/

空延迟(volatile unsigned int delay)

   while (delay--);


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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的线程标题表示您正在尝试使用 SPI1。 SPI0和 SPI1混合使用。 示例、此行

    PSCModuleControl (SOC_PSC_0_regs、HW_PSC_SPI0、PSC_POWERDOMAIN_AYS_ON、
    PSC_MDCTL_NEW_ENABLE);
    应为:

    PSCModuleControl (SOC_PSC_1_regs、HW_PSC_SPI1、PSC_POWERDOMAIN_AYS_ON、
    PSC_MDCTL_NEW_ENABLE);

    现在、这一点不重要、因为 GEL 脚本可能会为所有外设供电并计时。

    类似的行
    SPITransmitData1 (SOC_SPI_0_regs、tx16_DATA[0]);
    应改为使用 SOC_SPI_1_regs。 我认为您不会像这样直接调用 SPITransmitData1。 有很多 SOC_SPI_0_regs 引用应为 SOC_SPI_1_regs。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它在工作。 谢谢你、Norman。