创龙科技
直播中

汤玉荣

7年用户 183经验值
私信 关注

求C6748—RS485例程?

[tr]我现在用的开发板是c6748EVM A3,我在跑RS485例程的时候,可以直接输出程序中储存的字符串,但是当我从PC发送数据时,只有在调试状态单步进行并且只发送单个字符的时候串口终端才会有回显。另外我将485为改写为UART1中断触发,在中断服务函数设断点单步调试的时候可以进入中断,并打出一个字符,不设断点的话,无输出。程序用UART1的232串口是没有问题的,485就不行了,下面给程序。
/****************************************************************************/
/*                                                                          */
/*              广州创龙电子科技有限公司                                    */
/*                                                                          */
/*              Copyright 2014 Tronlong All rights reserved                 */
/*              RS485 串口测试                                              */
/*              2014年07月12日                                              */
/****************************************************************************/
#include "TL6748.h"                 // 创龙 DSP6748 开发板相关声明
#include "hw_types.h"               // 宏命令
#include "hw_syscfg0_C6748.h"       // 系统配置模块寄存器
#include "soc_C6748.h"              // DSP C6748 外设寄存器
#include "psc.h"                    // 电源与睡眠控制宏及设备抽象层函数声明
#include "gpio.h"                   // 通用输入输出口宏及设备抽象层函数声明
#include "uart.h"                   // 通用异步串口宏及设备抽象层函数声明
#include "uartStdio.h"              // 串口标准输入输出终端函数声明
#include "interrupt.h"              // DSP C6748 中断相关应用程序接口函数声明及系统事件号定义
#include
/*              宏定义                                                      */
// 时钟
#define SYSCLK_1_FREQ     (456000000)
#define SYSCLK_2_FREQ     (SYSCLK_1_FREQ/2)
#define UART_1_FREQ       (SYSCLK_2_FREQ)

/*              全局变量                                                    */

char txArray[] = "Tronglong RS485 Testing ......nr";
// 发送缓存
char Send[] = "Tronglong RS485 Testing ......nr";
// 接收缓存
unsigned char Receive;

/****************************************************************************/
/*                                                                          */
/*              延时函数                                                    */
/*                                                                          */
/****************************************************************************/
static void Delay (int length)
{
        while (length > 0)
                length--;
}

/****************************************************************************/
/*                                                                          */
/*              PSC 初始化                                                  */
/*                                                                          */
/****************************************************************************/
void PSCInit(void)
{
        // 使能 GPIO 模块
        // 对相应外设模块的使能也可以在 BootLoader 中完成
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
    // 使能 UART1 模块
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
}

/****************************************************************************/
/*                                                                          */
/*              GPIO 管脚复用配置                                           */
/*                                                                          */
/****************************************************************************/
void GPIOBankPinMuxSet(void)
{
        // 使能 UART1 禁用流控
        UARTPinMuxSetup(1, FALSE);
        // RS485 Enable 管脚
        RS485PinMuxSetup();
}

/****************************************************************************/
/*                                                                          */
/*              UART 初始化                                                 */
/*                                                                          */
/****************************************************************************/
void UARTInit(void)
{
        // 配置 UART1 参数
        // 波特率 115200 数据位 8 停止位 1 无校验位
    UARTConfigSetExpClk(SOC_UART_1_REGS, UART_1_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
        // 使能 UART1
        UARTEnable(SOC_UART_1_REGS);
    // 使能接收 / 发送 FIFO
    UARTFIFOEnable(SOC_UART_1_REGS);
    // 设置 FIFO 级别
    UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
        // 设置使能管脚为输出状态 GPIO0[11]
        GPIODirModeSet(SOC_GPIO_0_REGS, 12, GPIO_DIR_OUTPUT);
}
/****************************************************************************/
/*                                                                          */
/*              UART 中断服务函数                                           */
/*                                                                          */
/****************************************************************************/
unsigned char rxData = 0;
static void UARTIsr()
{
        static char RS485Send[] = "rn============Test Start===========.rnUnderwater communicate by DPSK.rn";
        static unsigned int length = sizeof(RS485Send);
    static unsigned int count = 0;

    unsigned int int_id = 0;

    // 确定中断源
    int_id = UARTIntStatus(SOC_UART_1_REGS);

    // 清除 UART2 系统中断
    IntEventClear(SYS_INT_UART1_INT);

    // 发送中断
    if(int_id == UART_INTID_TX_EMPTY)
    {
        if(length > 0)
        {
            // 写一个字节到 THR
            UARTCharPutNonBlocking(SOC_UART_1_REGS, RS485Send[count]);
            length--;
            count++;
        }
        if(length == 0)
        {
            // 禁用发送中断
            UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
        }
     }

    // 接收中断
    if(int_id == UART_INTID_RX_DATA)
    {
            rxData=UARTCharGetNonBlocking(SOC_UART_1_REGS);
                   // 使能发送
                   GPIOPinWrite(SOC_GPIO_0_REGS, 12, GPIO_PIN_HIGH);
                   Delay(200);
                   UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
                   // 关闭发送,使能接收
                   GPIOPinWrite(SOC_GPIO_0_REGS, 12, GPIO_PIN_LOW);
    }

    // 接收错误
    if(int_id == UART_INTID_RX_LINE_STAT)
    {
        while(UARTRxErrorGet(SOC_UART_1_REGS))
        {
            // 从 RBR 读一个字节
            UARTCharGetNonBlocking(SOC_UART_1_REGS);
        }
    }
    return;
}
/****************************************************************************/
/*                                                                          */
/*              UART2 中断初始化                                             */
/*                                                                          */
/****************************************************************************/
static void UARTInterruptInit(void)
{
        // 注册中断函数
        IntRegister(C674X_MASK_INT5, UARTIsr);
        // UART2中断映射
        IntEventMap(C674X_MASK_INT5, SYS_INT_UART1_INT);
        // 使能可屏蔽中断5
        IntEnable(C674X_MASK_INT5);

        // 使能中断
        unsigned int intFlags = 0;
    intFlags |= (UART_INT_LINE_STAT  | UART_INT_RXDATA_CTI);
//                 UART_INT_TX_EMPTY |

    UARTIntEnable(SOC_UART_1_REGS, intFlags);
}
/****************************************************************************/
/*                                                                          */
/*              DSP 中断初始化                                              */
/*                                                                          */
/****************************************************************************/
void InterruptInit(void)
{
        // 初始化 DSP 中断控制器
        IntDSPINTCInit();

        // 使能 DSP 全局中断
        IntGlobalEnable();
}
/****************************************************************************/
/*                                                                          */
/*              主函数                                                      */
/*                                                                          */
/****************************************************************************/
//F:CRABRecentWorkDSPdemoStarterWareApplicationRS485DebugRS485.ais

int main(void)
{
        // 外设使能配置
        PSCInit();
        // GPIO 管脚复用配置
        GPIOBankPinMuxSet();
        // DSP 中断初始化
        InterruptInit();
        // UART 初始化
        UARTInit();
        // UART 中断初始化
        UARTInterruptInit();

        // 发送字符串
        // 使能发送
        GPIOPinWrite(SOC_GPIO_0_REGS, 12, GPIO_PIN_HIGH);
        unsigned char i;
        for(i = 0; i < 34; i++)
                UARTCharPut(SOC_UART_1_REGS, Send
[/tr]

回帖(2)

李桂花

2020-5-1 14:31:04
485 是半双工的 默认处于接收状态 需要发送的时候才切换到发送状态
                   // 使能发送
                   GPIOPinWrite(SOC_GPIO_0_REGS, 12, GPIO_PIN_HIGH);
                   Delay(200);
                   UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
                   // 关闭发送,使能接收
                   GPIOPinWrite(SOC_GPIO_0_REGS, 12, GPIO_PIN_LOW);
接收中断做这些是很耗时间的 而且也不能这样做 会导致丢失数据
举报

李伟

2020-5-1 14:47:57

自动流控
举报

更多回帖

发帖
×
20
完善资料,
赚取积分