打印

当28335的SCI模块遇到485,出现RXERROR为1的错误

[复制链接]
6784|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
k410533234|  楼主 | 2012-12-26 10:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ic, cic, TE, ni, ST
TI官方非常贴心的为我们准备了28335的sci口例程,使用串口芯片232完全没有问题。例程主程序如下:

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File

// Prototype statements for functions found within this file.
void scic_echoback_init(void);
void scic_fifo_init(void);
void scic_xmit(int a);
void scic_msg(char *msg);

// Global counts used in this example
Uint16 LoopCount;
Uint16 ErrorCount;

void main(void)
{

    Uint16 ReceivedChar;
    char *msg;

// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP2833x_SysCtrl.c file.
   InitSysCtrl();

// Step 2. Initalize GPIO:
// This example function is found in the DSP2833x_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
   // InitGpio(); Skipped for this example

// For this example, only init the pins for the SCI-A port.
// This function is found in the DSP2833x_Sci.c file.
   InitScicGpio();

   InitXintf16Gpio();
// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
   DINT;

// Initialize PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the DSP2833x_PieCtrl.c file.
   InitPieCtrl();

// Disable CPU interrupts and clear all CPU interrupt flags:
   IER = 0x0000;
   IFR = 0x0000;

// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example.  This is useful for debug purposes.
// The shell ISR routines are found in DSP2833x_DefaultIsr.c.
// This function is found in DSP2833x_PieVect.c.
   InitPieVectTable();

// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP2833x_InitPeripherals.c
// InitPeripherals(); // Not required for this example

// Step 5. User specific code:

    LoopCount = 0;
    ErrorCount = 0;

    scic_fifo_init();    // Initialize the SCI FIFO
    scic_echoback_init();  // Initalize SCI for echoback

    msg = "\r\n\n\nHello World!\0";
    scic_msg(msg);

    msg = "\r\nYou will enter a character, and the DSP will echo it back! \n\0";
    scic_msg(msg);

for(;;)
    {
       msg = "\r\nEnter a character: \0";
       scic_msg(msg);

       // Wait for inc character
       while(ScicRegs.SCIFFRX.bit.RXFFST == 0) {} // wait for XRDY =1 for empty state
    msg = "  You sent: \0";
       scic_msg(msg);
     // Get all character
    do
    {
         ReceivedChar = ScicRegs.SCIRXBUF.all;
       // Echo character back      
         scic_xmit(ReceivedChar);
  }while(ScicRegs.SCIFFRX.bit.RXFFST != 0);

       LoopCount++;
    }

}


// Test 1,SCIA  DLB, 8-bit word, baud rate 0x000F, default, 1 STOP bit, no parity
void scic_echoback_init()
{
    // Note: Clocks were turned on to the SCIA peripheral
    // in the InitSysCtrl() function

  ScicRegs.SCICCR.all =0x0007;   // 1 stop bit,  No loopback
                                   // No parity,8 char bits,
                                   // async mode, idle-line protocol
ScicRegs.SCICTL1.all =0x0003;  // enable TX, RX, internal SCICLK,
                                   // Disable RX ERR, SLEEP, TXWAKE
ScicRegs.SCICTL2.all =0x0003;
ScicRegs.SCICTL2.bit.TXINTENA = 1;
ScicRegs.SCICTL2.bit.RXBKINTENA =1;
#if (CPU_FRQ_150MHZ)
       ScicRegs.SCIHBAUD    =0x0001;  // 9600 baud @LSPCLK = 37.5MHz.
       ScicRegs.SCILBAUD    =0x00E7;
#endif
#if (CPU_FRQ_100MHZ)
      ScicRegs.SCIHBAUD    =0x0001;  // 9600 baud @LSPCLK = 20MHz.
      ScicRegs.SCILBAUD    =0x0044;
#endif
ScicRegs.SCICTL1.all =0x0023;  // Relinquish SCI from Reset
}

// Transmit a character from the SCI
void scic_xmit(int a)
{
    while (ScicRegs.SCIFFTX.bit.TXFFST != 0) {}
    ScicRegs.SCITXBUF=a;

}

void scic_msg(char * msg)
{
    int i;
    i = 0;
    while(msg != '\0')
    {
        scic_xmit(msg);
        i++;
    }
}

// Initalize the SCI FIFO
void scic_fifo_init()
{
    ScicRegs.SCIFFTX.all=0xE040;
    ScicRegs.SCIFFRX.all=0x204f;
    ScicRegs.SCIFFCT.all=0x0;

}

//===========================================================================
// No more.
//===========================================================================

这个程序使用在232串口调试时完全没有问题。

现在因为需要改用485通讯。485通讯多了发送和接受使能控制功能。因为使用一问一答方式通讯,所以将485的两个控制口并在一起使用一个IO控制。



修改程序如下:

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
#define CON_485      GpioDataRegs.GPCDAT.bit.GPIO70
// Prototype statements for functions found within this file.
void scic_echoback_init(void);
void scic_fifo_init(void);
void scic_xmit(int a);
void scic_msg(char *msg);

// Global counts used in this example
Uint16 LoopCount;
Uint16 ErrorCount;

void main(void)
{

    Uint16 ReceivedChar;
    char *msg;

// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP2833x_SysCtrl.c file.
   InitSysCtrl();

// Step 2. Initalize GPIO:
// This example function is found in the DSP2833x_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
   // InitGpio(); Skipped for this example

// For this example, only init the pins for the SCI-A port.
// This function is found in the DSP2833x_Sci.c file.
   InitScicGpio();

   InitXintf16Gpio();
// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
   DINT;

// Initialize PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the DSP2833x_PieCtrl.c file.
   InitPieCtrl();

// Disable CPU interrupts and clear all CPU interrupt flags:
   IER = 0x0000;
   IFR = 0x0000;

// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example.  This is useful for debug purposes.
// The shell ISR routines are found in DSP2833x_DefaultIsr.c.
// This function is found in DSP2833x_PieVect.c.
   InitPieVectTable();

// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP2833x_InitPeripherals.c
// InitPeripherals(); // Not required for this example

// Step 5. User specific code:

    LoopCount = 0;
    ErrorCount = 0;

    scic_fifo_init();    // Initialize the SCI FIFO
    scic_echoback_init();  // Initalize SCI for echoback

    msg = "\r\n\n\nHello World!\0";
    scic_msg(msg);

    msg = "\r\nYou will enter a character, and the DSP will echo it back! \n\0";
    scic_msg(msg);

for(;;)
    {
       msg = "\r\nEnter a character: \0";
       scic_msg(msg);

       // Wait for inc character
       while(ScicRegs.SCIFFRX.bit.RXFFST == 0) {} // wait for XRDY =1 for empty state
    msg = "  You sent: \0";
       scic_msg(msg);
     // Get all character
    do
    {
         ReceivedChar = ScicRegs.SCIRXBUF.all;
       // Echo character back      
         scic_xmit(ReceivedChar);
  }while(ScicRegs.SCIFFRX.bit.RXFFST != 0);

       LoopCount++;
    }

}


// Test 1,SCIA  DLB, 8-bit word, baud rate 0x000F, default, 1 STOP bit, no parity
void scic_echoback_init()
{
    // Note: Clocks were turned on to the SCIA peripheral
    // in the InitSysCtrl() function

  ScicRegs.SCICCR.all =0x0007;   // 1 stop bit,  No loopback
                                   // No parity,8 char bits,
                                   // async mode, idle-line protocol
ScicRegs.SCICTL1.all =0x0003;  // enable TX, RX, internal SCICLK,
                                   // Disable RX ERR, SLEEP, TXWAKE
ScicRegs.SCICTL2.all =0x0003;
ScicRegs.SCICTL2.bit.TXINTENA = 1;
ScicRegs.SCICTL2.bit.RXBKINTENA =1;
#if (CPU_FRQ_150MHZ)
       ScicRegs.SCIHBAUD    =0x0001;  // 9600 baud @LSPCLK = 37.5MHz.
       ScicRegs.SCILBAUD    =0x00E7;
#endif
#if (CPU_FRQ_100MHZ)
      ScicRegs.SCIHBAUD    =0x0001;  // 9600 baud @LSPCLK = 20MHz.
      ScicRegs.SCILBAUD    =0x0044;
#endif
ScicRegs.SCICTL1.all =0x0023;  // Relinquish SCI from Reset
}

// Transmit a character from the SCI
void scic_xmit(int a)
{
    while (ScicRegs.SCIFFTX.bit.TXFFST != 0) {}
    ScicRegs.SCITXBUF=a;

}

void scic_msg(char * msg)
{
    int i;
    CON_485=1;//打开发送功能 使能发送485引脚    i = 0;
    while(msg != '\0')
    {
        scic_xmit(msg);
        i++;
    }
  CON_485=0;//关闭发送功能,使能接受功能}

// Initalize the SCI FIFO
void scic_fifo_init()
{
    ScicRegs.SCIFFTX.all=0xE040;
    ScicRegs.SCIFFRX.all=0x204f;
    ScicRegs.SCIFFCT.all=0x0;
   EALLOW;
   GpioCtrlRegs.GPCMUX1.bit.GPIO70 = 0;  //485_CON
   GpioCtrlRegs.GPCDIR.bit.GPIO70  = 1;  
   EDIS;

}
//===========================================================================
// No more.
//===========================================================================

只是增加了485的控制功能,但是现在出现SCIRXST中的PE、BRKDT、RXERROR都置1的错误。

发送功能正常。当把上面蓝色的字CON_485=1注释掉以后,接受就正常了,但是这时因为没有使能发送所以又无法发送了。

这是哪里的原因呢?

相关帖子

沙发
zj1| | 2014-4-1 18:09 | 只看该作者
楼主,你的问题后面是怎么解决的呀?我碰到了和你一样的问题,谢谢指点!

使用特权

评论回复
板凳
zhangmangui| | 2014-4-1 22:52 | 只看该作者
楼主看到帮楼上解答一下

使用特权

评论回复
地板
zhangmangui| | 2014-4-1 22:54 | 只看该作者
zj1 发表于 2014-4-1 18:09
楼主,你的问题后面是怎么解决的呀?我碰到了和你一样的问题,谢谢指点! ...

看看我的相关分享
https://bbs.21ic.com/icview-622807-1-1.html

使用特权

评论回复
5
xx1555| | 2014-7-21 17:36 | 只看该作者
楼主,你是如何解决的啊?我也遇到了跟你相同的问题,也是出现RXERROR , BRKDT , FE的错误。
急求楼主告知解决方法啊

使用特权

评论回复
6
vivilzb1985| | 2014-7-23 20:28 | 只看该作者
参照下楼上的了,很不错的啊

使用特权

评论回复
7
kangyin4545| | 2014-11-11 16:43 | 只看该作者
同样的问题,只能单独的发或者单独的收,一旦收发之间相互切换,就出现楼主的问题

使用特权

评论回复
8
zhangmangui| | 2014-11-11 21:13 | 只看该作者
232转485吗

使用特权

评论回复
9
kangyin4545| | 2014-11-12 15:26 | 只看该作者
28335的SCI通过485与上位机串口助手通信,单独发可以,单独收也可以
但发完之后再等待接受就不行
不知道问题出在哪了

使用特权

评论回复
10
huangfeng33| | 2014-11-19 11:46 | 只看该作者
如果你用的是28335的SCI的话,一次最多可以连续发送10位,而只能接收8位,这需要你配置相应的寄存器设置数据的有效位数。

使用特权

评论回复
11
llf021421| | 2014-11-19 14:02 | 只看该作者
发送使能之前把sci接收引脚设为通用输出,接收使能之后再把sci接收引脚还原成sci接收功能.
原因:发送使能之后,485芯片会把sci接收引脚拉低,造成误接收.

使用特权

评论回复
12
sunmenglin| | 2016-3-4 23:44 | 只看该作者
楼主,你的问题后面是怎么解决的呀?我碰到了和你一样的问题,谢谢指点!

使用特权

评论回复
13
hulongjun| | 2016-7-3 16:56 | 只看该作者
楼主怎么样了?解决了吗?

使用特权

评论回复
14
siyida| | 2016-7-4 17:03 | 只看该作者
485端口芯片工作在半双工,它的收发,由DE、RE使能的状态决定,在程序里修改好,就正常了。要不改用422全双工,收发自由,单必须遵守协议

使用特权

评论回复
15
luky1117| | 2016-8-12 15:11 | 只看该作者
我也遇到同样的问题,楼主怎么解决的,可以分享一下吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

9

帖子

2

粉丝