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:读取 SPI 问题

Guru**** 2558910 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/616249/starterware-spi-problem-to-read

工具/软件:Starterware

我在使用 CS0读取 SPI 1中的数据时遇到问题。

我正在使用 bb 和 starterware。

 我只想向从器件寄存器发送一个字节并读取该字节。

发送是可以的、但当我尝试读取数据时、我无法。 我看到示波器、CS、MOSI 和 MISO 中的信号看起来不错、我需要的数据在那里、但我无法从 bbb 寄存器读取。

我的设置函数包括:

/*
 **将时钟配置为 SPI
 *
静态空 McSPI1ModuleClkConfig (void){

   HWREG (SOC_CM_PER_REGS + CM_PER_L3S_CLKSTCTRL)=
       CM_PER_L3S_CLKSTCTRL_CLKTRCTRL_SW_WKUP;

   while ((HWREG (SOC_CM_PER_regs + CM_PER_L3S_CLKSTCTRL)和
       CM_PER_L3S_CLKSTCTRL_CLKTRCTRL)!= CM_PER_L3S_CLKSTCTRL_CLKTRCTRL_SW_WKUP);

   HWREG (SOC_CM_PER_regs + CM_PER_L3_CLKSTCTRL)=
       CM_PER_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP;

   while ((HWREG (SOC_CM_PER_regs + CM_PER_L3_CLKSTCTRL)和
       CM_PER_L3_CLKSTCTRL_CLKTRCTRL)!= CM_PER_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP);

   HWREG (SOC_CM_PER_REGS + CM_PER_L3_INSTR_CLKCTRL)=
       CM_PER_L3_INSTR_CLKCTRL_MODULEMODE_ENABLE;

   while ((HWREG (SOC_CM_PER_Regs + CM_PER_L3_INSTR_CLKCTRL)和
       CM_PER_L3_INSTR_CLKCTRL_MODULEMODE)!=
       CM_PER_L3_INSTR_CLKCTRL_MODULEMODE_ENABLE);

   HWREG (SOC_CM_PER_Regs + CM_PER_L3_CLKCTRL)=
       CM_PER_L3_CLKCTRL_MODULEMODE_ENABLE;

   while ((HWREG (SOC_CM_PER_regs + CM_PER_L3_CLKCTRL)和
       CM_PER_L3_CLKCTRL_MODULEMODE)!= CM_PER_L3_CLKCTRL_MODULEMODE_ENABLE);

   HWREG (SOC_CM_PER_REGS + CM_PER_OCPWP_L3_CLKSTCTRL)=
       CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP;

   while ((HWREG (SOC_CM_PER_regs + CM_PER_OCPWP_L3_CLKSTCTRL)和
       CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL)!=
       CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP);

   HWREG (SOC_CM_PER_REGS + CM_PER_L4LS_CLKSTCTRL)=
       CM_PER_L4LS_CLKSTCTRL_CLKTRCTRL_SW_WKUP;

   while ((HWREG (SOC_CM_PER_regs + CM_PER_L4LS_CLKSTCTRL)和
       CM_PER_L4LS_CLKSTCTRL_CLKTRCTRL)!=
       CM_PER_L4LS_CLKSTCTRL_CLKTRCTRL_SW_WKUP);

   HWREG (SOC_CM_PER_REGS + CM_PER_L4LS_CLKCTRL)=
       CM_PER_L4LS_CLKCTRL_MODULEMODE_ENABLE;

   while ((HWREG (SOC_CM_PER_regs + CM_PER_L4LS_CLKCTRL)和
       CM_PER_L4LS_CLKCTRL_MODULEMODE)!= CM_PER_L4LS_CLKCTRL_MODULEMODE_ENABLE);

   HWREG (SOC_CM_PER_REGS + CM_PER_SPI1_CLKCTRL)&&=~CM_PER_SPI1_CLKCTRL_MODULEMODE;

   HWREG (SOC_CM_PER_REGS + CM_PER_SPI1_CLKCTRL)|= CM_PER_SPI1_CLKCTRL_MODULEMODE_ENABLE;

   while ((HWREG (SOC_CM_PER_regs + CM_PER_SPI1_CLKCTRL)和
       CM_PER_SPI1_CLKCTRL_MODULEMODE)!= CM_PER_SPI1_CLKCTRL_MODULEMODE_ENABLE);


   while (!(HWREG (SOC_CM_PER_regs + CM_PER_L3S_CLKSTCTRL)&
       CM_PER_L3S_CLKSTCTRL_CLKACTIVITY_L3S_GCLK);

   while (!(HWREG (SOC_CM_PER_Regs + CM_PER_L3_CLKSTCTRL)和
       CM_PER_L3_CLKSTCTRL_CLKACTIVITY_L3_GCLK);

   while (!(HWREG (SOC_CM_PER_Regs + CM_PER_OCPWP_L3_CLKSTCTRL)和
       (CM_PER_OCPWP_L3_CLKSTCTRL_CLKACTIVITY_OCPWP_L3_GCLK |
       CM_PER_OCPWP_L3_CLKSTCTRL_CLKACTIVITY_OCPWP_L4_GCLK)));

   while (!(HWREG (SOC_CM_PER_regs + CM_PER_L4LS_CLKSTCTRL)和
       (cm_per_L4LS_CLKSTCTRL_CLKACTIVITY_L4LS_GCLK |
       CM_PER_L4LS_CLKSTCTRL_CLKACTIVITY_SPI_GCLK));

/*
 **此函数将调用必要的 McSPI API,这些 API 将配置
 ** McSPI 控制器。
 *
静态空 McSPISetUp (空){
   /*重置 McSPI 实例。*/
   McSPIReset (SOC_SPI_1_regs);
   /*启用芯片选择引脚。*/
   McSPICSEnable (SOC_SPI_1_regs);
   /*启用主操作模式。*/
   McSPIMasterModeEnable (SOC_SPI_1_regs);
   /********* /
    //cs0
   McSPIMasterModeConfig (SOC_SPI_1_regs、MCSPI_SINGLE_CH、
       MCSPI_TX_RX_MODE、MCSPI_DATA_LINE_COMM_MODE_1、
       0);
   McSPIClkConfig (SOC_SPI_1_regs、MCSPI_IN_CLK、MCSPI_OUT_FREQ、0、
       MCSPI_CLK_MODE_0);
   McSPIWordLengthSet (SOC_SPI_1_regs、MCSPI_WORD_LENGTH (8)、0);
   McSPICSPPolarityConfig (SOC_SPI_1_regs、MCSPI_CS_POL_LOW、0);
   McSPITxFIFOConfig (SOC_SPI_1_regs、MCSPI_TX_FIFO_ENABLE、0);//para de enegar Dados no CS1
   McSPIRxFIFOConfig (SOC_SPI_1_regs、MCSPI_RX_FIFO_ENABLE、0);
   / /

/*
 **此函数选择使用 McSPI 引脚。 McSPI 引脚
 *         与 SoC 中其他外设的引脚进行多路复用
 *
静态空 McSPI1PinMuxSetup (void){

   /*
   CONTACT_CONF_McASP0_FSX   -> d0
   CONTROL_CONF_McASP0_AXR0  -> D1
   CONTRAL_CONF_McASP0_ACLKX -> clk*/
   HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_McASP0_ACLKX)= 0x33;
   HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_McASP0_FSX)= 0x33;
   HWREG (SOC_CONTROL_REGS + CONTROL_CONF_McASP0_AXR0)= 0x33;


/*
 **将时钟配置为 SPI
 *
静态空 McSPI1CSPinMuxSetup(){
   HWREG (SOC_CONTRAL_REGS + CONTRAL_UART_RTSN (0))= 0xD;//SPI_1-CS_0
   HWREG (SOC_CONTRAL_REGS + CONTRAL_UART_RTSN (1))= 0xC;//SPI_1-CS_1

/*
 **此功能将激活/停用 CS 线路,并启用 Tx 和 Rx
 ** McSPI 外设的中断。
 *
unsigned char McSPIRead (unsigned char reg、unsigned int channel){
   P_TX = txBuffer;
   P_Rx = rxBuffer;
   length = size;

   ConsoleUtilsPrintf ("\n\rMcSPI 读取长度:%x",长度);

   /* SPIEN 线被迫处于低电平状态。*/
   McSPICSAssert (SOC_SPI_1_regs、通道);

   /*启用 McSPI 通道进行通信。*/
   McSPIChannelEnable (SOC_SPI_1_regs、通道);
   /********* /
   
   McSPITransmitData (SOC_SPI_1_regs、(unsigned int)(reg)、channel);
    *lData++=(unsigned char) McSPIReceiveData (SOC_SPI_1_regs、channel);


   McSPITransmitData (SOC_SPI_1_regs、(unsigned int)(0x00)、channel);//teste remotre segunda escrisa//NAO   funfa
    *lData++=(unsigned char) McSPIChannelStatusGet (SOC_SPI_1_regs、channel);


   / /
   /*强制 SPIEN 线进入非活动状态。*/
   McSPICSDeAssert (SOC_SPI_1_regs、通道);

   /*禁用 McSPI 通道。*/
   McSPIChannelDisable (SOC_SPI_1_regs、channel);


   返回0;