搜索
bottom↓
回复: 9

NEC V850E 串口不会用

[复制链接]

出0入0汤圆

发表于 2010-6-24 10:10:28 | 显示全部楼层 |阅读模式
我用applilet自动生成了串口函数

#include "CG_macrodriver.h"
#include "CG_serial.h"
/* Start user code for include. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */
#include "CG_userdefine.h"

/*
*******************************************************************************
**  Global define
*******************************************************************************
*/
UCHAR  *gpUarta1TxAddress;        /* uarta1 transmit buffer address */
USHORT gUarta1TxCnt;                /* uarta1 transmit data number */
UCHAR  *gpUarta1RxAddress;        /* uarta1 receive buffer address */
USHORT gUarta1RxCnt;                /* uarta1 receive data number */
USHORT gUarta1RxLen;                /* uarta1 receive data length */
/* Start user code for global. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */

/*
**-----------------------------------------------------------------------------
**
**  Abstract:
**        This function initializes the UARTA1 module.
**
**  Parameters:
**        None
**
**  Returns:
**        None
**
**-----------------------------------------------------------------------------
*/
void UARTA1_Init(void)
{
        UA1TXE = 0U;        /* disable UARTA1 transmission operation */
        UA1RXE = 0U;        /* disable UARTA1 reception operation */
        UA1PWR = 0U;        /* disable UARTA1 operation */
        UA1TMK = 1U;        /* disable INTUA1T interrupt */
        UA1TIF = 0U;        /* clear INTUA1T interrupt flag */
        UA1RMK = 1U;        /* disable INTUA1R interrupt */
        UA1RIF = 0U;        /* clear INTUA1R interrupt flag */
        /* Set INTUA1T level low priority */
        UA1TIC |= 0x07U;
        /* Set INTUA1R level low priority */
        UA1RIC |= 0x07U;
        UA1CTL1 = 0x03;
        UA1CTL2 = _0D_UARTA1_BASECLK_DIVISION;
        UA1CTL0 = _10_UARTA_TRANSFDIR_LSB | _00_UARTA_PARITY_NONE | _02_UARTA_DATALENGTH_8BIT | _00_UARTA_STOPLENGTH_1BIT;
        UA1OPT0 = _14_UARTA_UAnOPT0_INITIALVALUE | _00_UARTA_TRAN_DATALEVEL_NORMAL | _00_UARTA_REC_DATALEVEL_NORMAL;
        UA1PWR = 1U;        /* enable UARTA1 operation */

        /* Set alternate-function pin to UARTA I/O pin. */
        /* Set TXDA1 output and RXDA1 input. */
        PFC3_bit.no0        = 0;
        PFCE3_bit.no0        = 0;
        PMC3_bit.no0        = 1;

    PFC3_bit.no1        = 0;
        PFCE3_bit.no1        = 0;
        PMC3_bit.no1        = 1;
}
/*
**-----------------------------------------------------------------------------
**
**  Abstract:
**        This function starts the UARTA1 operation.
**
**  Parameters:
**        None
**
**  Returns:
**        None
**
**-----------------------------------------------------------------------------
*/
void UARTA1_Start(void)
{
        UA1TIF = 0U;        /* clear INTUA1T interrupt flag */
        UA1TMK = 0U;        /* enable INTUA1T interrupt */
        UA1RIF = 0U;        /* clear INTUA1R interrupt flag */
        UA1RMK = 0U;        /* enable INTUA1R interrupt */
        UA1TXE = 1U;        /* enable UARTA1 transmission operation */
        UA1RXE = 1U;        /* enable UARTA1 reception operation */
}
/*
**-----------------------------------------------------------------------------
**
**  Abstract:
**        This function stops the UARTA1 operation.
**
**  Parameters:
**        None
**
**  Returns:
**        None
**
**-----------------------------------------------------------------------------
*/
void UARTA1_Stop(void)
{
        UA1TXE = 0U;        /* disable UARTA1 transmission operation */
        UA1RXE = 0U;        /* disable UARTA1 reception operation */
        UA1TMK = 1U;        /* disable INTUA1T interrupt */
        UA1TIF = 0U;        /* clear INTUA1T interrupt flag */
        UA1RMK = 1U;        /* disable INTUA1R interrupt */
        UA1RIF = 0U;        /* clear INTUA1R interrupt flag */
}
/*
**-----------------------------------------------------------------------------
**
**  Abstract:
**        This function receives UARTA1 data.
**
**  Parameters:
**        rxbuf: receive buffer pointer
**        rxnum: buffer size
**
**  Returns:
**        MD_OK
**        MD_ARGERROR
**
**-----------------------------------------------------------------------------
*/
MD_STATUS UARTA1_ReceiveData(UCHAR *rxbuf, USHORT rxnum)
{
        MD_STATUS status = MD_OK;
       
        if (rxnum < 1U)
        {
                status = MD_ARGERROR;
        }
        else
        {
                gUarta1RxCnt = 0U;
                gUarta1RxLen = rxnum;
                gpUarta1RxAddress = rxbuf;
                status = MD_OK;
        }

        return (status);
}
/*
**-----------------------------------------------------------------------------
**
**  Abstract:
**        This function sends UARTA1 data.
**
**  Parameters:
**        txbuf: transfer buffer pointer
**        txnum: buffer size
**
**  Returns:
**        MD_OK
**        MD_ARGERROR
**        MD_DATAEXISTS
**
**-----------------------------------------------------------------------------
*/
MD_STATUS UARTA1_SendData(UCHAR *txbuf, USHORT txnum)
{
        MD_STATUS status = MD_OK;
       
        if (txnum < 1U)
        {
                status = MD_ARGERROR;
        }
        else
        {
                gpUarta1TxAddress = txbuf;
                gUarta1TxCnt = txnum;       
                if((UA1STR & 0x80U) == 0U)
                {
                        UA1TMK = 1U;        /* disable INTUA1T interrupt */
                        UA1TX = *gpUarta1TxAddress;
                        gpUarta1TxAddress++;
                        gUarta1TxCnt--;
                        UA1TMK = 0U;        /* enable INTUA1T interrupt */
                        status = MD_OK;
                }
                else
                {
                        status = MD_DATAEXISTS;
                }
        }

        return (status);
}

/* Start user code for adding. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */


然后我在main函数中如下调用
UARTA1_Start();      
UARTA1_SendData("hello ",6);
UARTA1_Stop();

但是串口无输出,请问大侠们,NEC串口到底怎么用啊?谢谢

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2010-6-24 16:54:11 | 显示全部楼层
debug是单步没问题,但是go以后就不行了

出0入0汤圆

 楼主| 发表于 2010-6-25 13:53:53 | 显示全部楼层
MCU工作在64MHz
波特率是9600

貌似是MCU工作频率太高的缘故,所以在适当的位置加入延时就OK了。

MD_STATUS UARTA1_SendData(UCHAR *txbuf, USHORT txnum)
{
MD_STATUS status = MD_OK;

if (txnum < 1U)
{
status = MD_ARGERROR;
}
else
{
gpUarta1TxAddress = txbuf;
gUarta1TxCnt = txnum;
if((UA1STR & 0x80U) == 0U)
{
UA1TMK = 1U; /* disable INTUA1T interrupt */
UA1TX = *gpUarta1TxAddress;
gpUarta1TxAddress++;
gUarta1TxCnt--;
UA1TMK = 0U; /* enable INTUA1T interrupt */

//add delay 100us

status = MD_OK;
}
else
{
status = MD_DATAEXISTS;
}
}


不知道还有没有更好的办法。

出0入0汤圆

 楼主| 发表于 2010-6-25 15:11:24 | 显示全部楼层
经测试:

CPU频率降低到最低的1MHz
波特率提高到256000

可以直接用applilet3生成的串口函数,正确发送data,无需再添加延时函数。

出0入0汤圆

发表于 2010-6-25 17:08:28 | 显示全部楼层
LZ用的是哪块MCU?

出0入0汤圆

 楼主| 发表于 2010-6-25 17:32:53 | 显示全部楼层
V850E/IG3 (70F3454)

出0入0汤圆

 楼主| 发表于 2010-6-25 19:45:07 | 显示全部楼层
使用applilet生成的函数UARTA1_SendData("h", 1);发送一个字节已经OK(CPU频率任意,波特率任意),发送多个字节方法还没找到。
示例如下:

while(1)
{
      while(UA1STR_bit.no7 == 1U); //发送前,先判断前一个data是否发送成功,不成功则循环
      UARTA1_SendData("h", 1);

      while(UA1STR_bit.no7 == 1U);
      UARTA1_SendData("e", 1);

      while(UA1STR_bit.no7 == 1U);
      UARTA1_SendData("l", 1);

      while(UA1STR_bit.no7 == 1U);
      UARTA1_SendData("l", 1);

      while(UA1STR_bit.no7 == 1U);
      UARTA1_SendData("o", 1);

      while(UA1STR_bit.no7 == 1U);
      UARTA1_SendData(" ", 1);
}

出0入0汤圆

 楼主| 发表于 2010-6-26 09:17:51 | 显示全部楼层
NEC V850串口发送最简单的实现方法(非中断,使用IAR编译器)

void put_char(unsigned char c)
{
    while(UA1TSF == 1U)
        ;
    UA1TX = c;
}

出0入0汤圆

发表于 2010-6-28 09:01:23 | 显示全部楼层
V850E/Ix3好象没有配套的Applilet嘛,不过网上有应用手册和例程

点击此处下载 ourdev_564378J1I3JP.pdf(文件大小:190K) (原文件名:UARTA-U18723EJ1V0AN00.pdf)
点击此处下载 ourdev_564379LQAFTP.zip(文件大小:5K) (原文件名:UARTA-U18723EJ1V0AN00_SRC.zip)

出0入0汤圆

 楼主| 发表于 2010-6-28 10:16:02 | 显示全部楼层
回复【8楼】sophie0403
v850e/ix3好象没有配套的applilet嘛,不过网上有应用手册和例程
点击此处下载  (原文件名:uarta-u18723ej1v0an00.pdf)  
点击此处下载  (原文件名:uarta-u18723ej1v0an00_src.zip)  

-----------------------------------------------------------------------

是的,我用的是applilet3 for V850ESJX3结合V850E应用手册来修改的

NEC出这么一个applilet 工具非常好,但问题是applilet不支持NEC所有的MCU,这个应该任务量也不大吧

还有一个问题就是,NEC不同系列的MCU对应不一样的applilet,这样对NEC不熟悉的人来说找起来很不方便,整合在一起不是更好吗?维护也方便,客户使用也简单方便。

真不知道NEC是怎么想的,哎。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-16 01:55

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表