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.8335万:SCI环回中断示例修改,RX问题

Guru**** 2558250 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/634825/tms320f28335-sci-loopback-interrupt-example-modification-rx-problem

部件号:TMS320F2.8335万

我从i为2833x设备调制scia_loopback_interrupts开始。 基本上,当通过LOOPBKENA寄存器为SCIA和SCIC配置启用环回时,该示例对这两种配置都起作用。 但是,当我从LOOPBKENA寄存器禁用回送时, 当RX上有实际信号时,我不再收到接收中断。

我通过使用RS485 IC手动将TX缩短到RX来测试它(启用IC的驱动器启用和接收启用基本上可以完成此任务), 通过示波器查看RX引脚上的信号,一切对我来说都很好,配置上没有区别,除了手动完成环回而不是使用LOPBKENA寄存器。

下面是我在示例中修改的代码。

Void主(void)

  UINT16 I;

//步骤1. 初始化系统控制:
// PLL,看门狗,启用外设时钟
//此示例函数位于DSP2833x_sysctrl.c文件中。
  InitSysCtrl();

//步骤2. 初始化GPIO:
//此示例函数可在DSP2833x_GPIO.c文件和中找到
//说明了如何将GPIO设置为其默认状态。
// InitGpio();
//仅为SCI-A和SCI-B功能设置GP I/O
//此函数位于DSP2833x_Sci.c中
  InitSCI_GPIO ();

//步骤3. 清除所有中断并初始化PIE矢量表:
//禁用CPU中断
  色调;

//将PIE控制寄存器初始化到其默认状态。
//默认状态是禁用所有PIE中断和标志
//被清除。
//此函数位于DSP2833x_PIECTRL.c文件中。
  InitPieCtrl();

//禁用CPU中断并清除所有CPU中断标志:
  IER = 0x0000;
  IFR = 0x0000;

//使用指向外壳中断的指针初始化PIE矢量表
//服务例程(ISR)。
//这将填充整个表,即使中断也是如此
//在本例中不使用。  这对于调试非常有用。
// shell ISR例程可在DSP2833x_DefaultIsr.C.中找到
//此函数位于DSP2833x_PieVect.C.中
  InitPieVectorTable();

//本示例中使用的中断被重新映射到
//此文件中找到ISR函数。
  EALLOW;   //这是写入EALLOW保护寄存器所必需的
  PieVectorTable.SCIRXINTA =&sciaRxFifoIsr;
  PieVectorTable.SCIRXINTC =&scicRxFifoIsr;
  EDIS;  //这是禁用写入EALLOW保护寄存器所必需的

//步骤4. 初始化所有设备外围设备:
//此函数位于DSP2833x_InitPeripherals.c中
// InitPeripherals();//本示例不需要
  scia_fifo_init();// 初始化SCI-A
  scic_fifo_init();// 初始化SCI-A

//步骤5. 用户特定代码,启用中断:

//初始化发送数据。  每次传输后,此数据
//将为下一次传输更新
  用于(i = 0;I<8;I++)
  {
     sdataA[i]= i;
  }

  RDATA_pointA = sdataA[0];

//启用此示例所需的中断
  PieCtrlRegs.PIECTRL.bit.ENPIE =1;  //启用PIE块
  PieCtrlRegs.PIEIER9.bit.INTx1=1;//    PIE组9,INT1 SCIRXINTA,
  PieCtrlRegs.PIEIER8.bit.INTx5=1;    // PIE组8,INT5 SCIRXINTC
  IER = 0x180;   //启用CPU INT 9和8
  EINT;

//步骤6。 空闲循环。 只需坐下来永远循环(可选):
   对于(;;)
   {
      while (SciaRegs.SCIFFTX.Bit.TXFFST !=0){}
      对于(i=0;i< 8;i++)
      {
         SciaRegs.SCITXBUF=sdataA[I];//    发送数据
      }
       while (ScicRegs.SCIFFTX.bit.TXFFST !=0){}
       对于(i=0;i< 8;i++)
       {
          ScicRegs.SCITXBUF=sdataA[I];//    发送数据
       }
   }
}

__interrupt void sciaRxFifoIsr (void)

   UINT16 I;
   对于(i=0;i<8;i++)
   {
     rdataA[i]=SciaRegs.SCIRXBUF.all;   //读取数据
   }

   SciaRegs.SCIFFRX.Bit.RXFFOVRCLR=1;  //清除溢出标志
   SciaRegs.SCIFFRX.Bit.RXFFINTCLR=1;  //清除中断标志

   PieCtrlRegs.PIEACK.ALL |= PIEACK_group9;      //发出pie ack
}
__interrupt void scicRxFifoIsr (void)

   UINT16 I;
   对于(i=0;i<8;i++)
   {
      rdataA[i]=ScicRegs.SCIRXBUF.ALL; //读取数据
   }

   ScicRegs.SCIFFRX.Bit.RXFFOVRCLR=1;  //清除溢出标志
   ScicRegs.SCIFFRX.bit.RXFFINTCLR=1;  //清除中断标志

   PieCtrlRegs.PIEACK.ALL || PIEACK_group8;
}
void scia_fifo_init()

  SciaRegs.SCICCR.ALL =0x0007;  // 1停止位, 无回送
                                 //无奇偶校验,8个字符位,
                                 //异步模式,空闲线路协议
  SciaRegs.SCICTL1.all =0x0003; //启用TX,RX,内部SCICLK,
                                 //禁用RX ERR,睡眠,TXWAKE
  SciaRegs.SCICTL2.bit.TXINTENA =1;
  SciaRegs.SCICTL2.bit.RXBKINTENA =1;
  SciaRegs.SCIHBAUD = 0x0000;
  SciaRegs.SCILBAUD = 7;//(30E6/4)/((7+1)*8)=11.7187万波特率,从11.52万波特创建1.72 错误(2 % 错误或更低是理想的)
  SciaRegs.SCICCR.bit.LOOPBKENA =1;//启用回路
  SciaRegs.SCIFFTX.All=0xC028;
  SciaRegs.SCIFFRX.all=0x0028;
  SciaRegs.SCIFFCT.All=0x00;

  SciaRegs.SCICTL1.all =0x0023;    //从重置放弃SCI
  SciaRegs.SCIFFTX.Bit.TXFIFOXRESET=1;
  SciaRegs.SCIFFRX.Bit.RXFIFORESET=1;
}

void scic_fifo_init()

  ScicRegs.SCICCR.ALL =0x0007;  // 1停止位, 无回送
                                 //无奇偶校验,8个字符位,
                                 //异步模式,空闲线路协议
  ScicRegs.SCICTL1.ALL =0x0003; //启用TX,RX,内部SCICLK,
                                 //禁用RX ERR,睡眠,TXWAKE
  ScicRegs.SCICTL2.bit.TXINTENA =1;
  ScicRegs.SCICT2.bit.RXBKINTENA =1;
  ScicRegs.SCIHBAUD = 0x0000;
  ScicRegs.SCILBAUD = 7;//(30E6/4)/((7+1)*8)=11.7187万波特率,从11.52万波特创建1.72 错误(2 % 错误或更低是理想的)
  ScicRegs.SCICCR.bit.LOOPBKENA =1;//启用回路
  ScicRegs.SCIFFTX.all=0xC028;
  ScicRegs.SCIFFRX.all=0x0028;
  ScicRegs.SCIFFCT.All=0x00;

  ScicRegs.SCICTL1.ALL =0x0023;    //从重置放弃SCI
  ScicRegs.SCIFFTX.Bit.TXFIFOXRESET=1;
  ScicRegs.SCIFFRX.bit.RXFIFORESET=1;
}

void InitSCI_GPIO ()

   EALLOW;

   //
   //为所选引脚启用内部上拉
   //用户可以启用或禁用上拉功能。
   //这将启用指定引脚的上拉。
   //
   gpioCtrlRegs.GPBPUD.bit.GPIO36 = 1; //禁用GPIO36的上拉(SCIRXDA)
   gpioCtrlRegs.GPBPUD.bit.GPIO35 = 1; //禁用GPIO35的上拉(SCITXDA)

   //
   //将所选引脚的限定条件设置为仅异步
   //默认情况下,输入与SYSCLKOUT同步。
   //这将为所选引脚选择异步(无限定条件)。
   //
   gpioCtrlRegs.GPBQSEL1.bit.GPIO36 = 3; //异步输入GPIO36 (SCIRXDA)

   //
   //使用GPIO寄存器配置SCI-A引脚
   //这指定了哪些可能的GPIO引脚将是SCI功能引脚
   //引脚。
   //
   gpioCtrlRegs.GPBMUX1.bit.GPIO36 = 1;//将GPIO36配置为SCIRXDA
   gpioCtrlRegs.GPBMUX1.bit.GPIO35 = 1;//将GPIO35配置为SCITXDA

   gpioCtrlRegs.GPCPUD.bit.GPIO72 = 1; //禁用接收启用SCIA的上拉菜单
   gpioCtrlRegs.GPBPUD.bit.GPIO45 = 1; //禁用接收启用SCIA的上拉菜单
   gpioCtrlRegs.GPBPUD.bit.GPIO44 = 1; //禁用驱动器启用SCIA的上拉菜单

   //
   //使用GPIO寄存器配置SCI-A引脚
   //这指定了哪些可能的GPIO引脚将是SCI功能引脚
   //引脚。
   //
   GpioCtrlRegs.GPCMUX1.bit.GPIO72 = 0;
   gpioCtrlRegs.GPBMUX1.bit.GPIO45 = 0;
   gpioCtrlRegs.GPBMUX1.bit.GPIO44 = 0;

   GpioCtrlRegs.GPCDIR.bit.GPIO72 = 1;
   gpioCtrlRegs.GPBDIR.bit.GPIO45 = 1;
   gpioCtrlRegs.GPBDIR.bit.GPIO44 = 1;

   GpioDataRegs.GPCSET.bit.GPIO72 = 1;//未启用接收
   GpioDataRegs.GPBSET.bit.GPIO45 = 1;//未启用接收
   GpioDataRegs.GPBCLEAR.bit.GPIO44 = 1;//驱动器未启用

   //
   //为所选引脚启用内部上拉
   //用户可以启用或禁用上拉功能。
   //这将启用指定引脚的上拉。
   //
   gpioCtrlRegs.GPBPUD.bit.GPIO62 = 1; //禁用上拉(SCIRXDC)
   gpioCtrlRegs.GPBPUD.bit.GPIO63 = 1; //禁用上拉(SCITXDC)

   //
   //将所选引脚的限定条件设置为仅异步
   //默认情况下,输入与SYSCLKOUT同步。
   //这将为所选引脚选择异步(无限定条件)。
   //
   gpioCtrlRegs.GPBQSEL2.bit.GPIO62 = 3; //异步输入GPIO62 (SCIRXDC)

   //
   //使用GPIO寄存器配置SCI-A引脚
   //这指定了哪些可能的GPIO引脚将是SCI功能引脚
   //引脚。
   //
   gpioCtrlRegs.GPBMUX2.bit.GPIO62 = 1;//将GPIO62配置为SCIRXDC
   gpioCtrlRegs.GPBMUX2.bit.GPIO63 = 1;//将GPIO63配置为SCITXDC

   gpioCtrlRegs.GPCPUD.bit.GPIO65 = 1; //禁用接收启用SCIC的上拉菜单
   gpioCtrlRegs.GPCPUD.bit.GPIO64 = 1; //禁用驱动器启用SCIC的上拉菜单
   //
   //使用GPIO寄存器配置SCI-A引脚
   //这指定了哪些可能的GPIO引脚将是SCI功能引脚
   //引脚。
   //
   GpioCtrlRegs.GPCMUX1.bit.GPIO65 = 0;
   GpioCtrlRegs.GPCMUX1.bit.GPIO64 = 0;


   GpioCtrlRegs.GPCDIR.bit.GPIO65 = 1;
   GpioCtrlRegs.GPCDIR.bit.GPIO64 = 1;


   GpioDataRegs.GPCSET.bit.GPIO65 = 1;//未启用接收
   GpioDataRegs.GPCCLEAR.bit.GPIO64 = 1;//驱动器未启用

   EDIS;
}

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

    是否将SCIA TX连接到SCIC RX? 和SCIC Tx to SCIA RX?

    我是否正确理解这一点? 您正在尝试执行外部回送?

    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    否,我的外部回送是将sciatx连接到sciarx,将scictx连接到scicrx。 执行此操作时,我禁用了代码中的LOOPBACKENA位。 为了确保外部回送正常,我使用示波器检查了每个Rx引脚,并看到了与TX引脚相同的数据。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果内部回送正常工作,然后使用正确的针脚禁用内部回送,我想不出外部回送无法正常工作的任何原因。

    您确定唯一的区别是LOOPBACKEN位吗?

    我认为这可能是硬件问题。

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

    是的,我确定唯一的区别是LOOPBACKEN位。 我只对该部分进行注释,然后在配置外部回送后,我看到实际Rx引脚上的信号与带示波器的TX引脚相同。 所以硬件对我来说还可以,我只是不知道... 同时,我也在尝试对SCIA和SCIC使用相同的功能。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不要评论LOOPBACKEN =1;这次我尝试将其更改为LOOPBACKEN =0;
    尽管我正在擦除闪存,LOOPPACKEN的默认值已经为0,但这似乎解决了我的问题。 这对我来说有点奇怪,因为它有一个默认值,它已经是0。 我不明白这实际上是如何解决我的问题的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我很高兴这解决了您的问题。

    SCI模块的初始化顺序非常精细。 某些位和寄存器需要按特定顺序配置。 我认为这与休息和解除复位有关。

    很高兴你让它工作了!

    SAL