智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2182|回复: 0
打印 上一主题 下一主题

写了个UART但是怎么也不能正确发送,时钟和波特率寄存器都差了总是不行求帮助

[复制链接]

1

主题

2

帖子

0

精华

高级会员

Rank: 4

积分
590
威望
295
贡献
157
兑换币
133
注册时间
2012-6-20
在线时间
73 小时
毕业学校
山东科大
跳转到指定楼层
1#
发表于 2013-5-6 16:27:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1贡献
本帖最后由 Vancaspar 于 2013-5-6 16:29 编辑

#include "support_common.h"
#include "UART.h"
int a,b;
long int d;

void uart_init(uint8 channel, uint32 baudrate, uint32 sys_clk)
{       
        register uint16 div;
        switch(channel)
        {
        case 1:
                MCF_GPIO_PUBPAR = (0
                                                        | MCF_GPIO_PUBPAR_UTXD1_UTXD1
                                                             | MCF_GPIO_PUBPAR_URXD1_URXD1);
                                                                       //|MCF_GPIO_PUBPAR_URTS1_URTS1
                                                                       //|MCF_GPIO_PUBPAR_UCTS1_UCTS1;
                break;
        case 2:
                MCF_GPIO_PUBPAR = (0
                                                        | MCF_GPIO_PUBPAR_URTS1_UTXD2
                                                                    | MCF_GPIO_PUBPAR_UCTS1_URXD2);
                                                                //|MCF_GPIO_PUBPAR_URTS1_URTS1
                                                                       //|MCF_GPIO_PUBPAR_UCTS1_UCTS1;
                break;
        case 0:
        default:
                MCF_GPIO_PUAPAR = (0
                                                        | MCF_GPIO_PUAPAR_UTXD0_UTXD0
                                                        | MCF_GPIO_PUAPAR_URXD0_URXD0);
        }
       
        //Reset Transmitter, Receiver & Mode Register
                MCF_UART_UCR(channel) = MCF_UART_UCR_RESET_TX;
                MCF_UART_UCR(channel) = MCF_UART_UCR_RESET_RX;                                    
                MCF_UART_UCR(channel) = MCF_UART_UCR_RESET_MR;            
        //Set        UART interrupts       
                MCF_UART_UIMR(channel) = 0;//MCF_UART_UISR_FFULL_RXRDY;
                                                  //|MCF_UART_UISR_TXRDY;
                                                  //|MCF_UART_UISR_DB
                                                  //|MCF_UART_UISR_COS
                /*
                MCF_INTC0_IMRL &= ~MCF_INTC_IMRL_MASKALL;
                MCF_INTC0_IMRL &= ~MCF_INTC_IMRL_INT_MASK13;//UART0
                MCF_INTC0_ICR13 = MCF_INTC_ICR_IP(6) + MCF_INTC_ICR_IL(2);//UART0       
                */
        //Set Rx and Tx buad by SYSTERM CLOCK
                MCF_UART_UCSR(channel) =(0
                                                                | MCF_UART_UCSR_RCS_SYS_CLK
                                                                | MCF_UART_UCSR_TCS_SYS_CLK);
                                               
        //No parity,8bit data  //----for UMR1-----//
                MCF_UART_UMR(channel) = (0
                                                                | MCF_UART_UMR_PM_NONE               
                                                                | MCF_UART_UMR_BC_8);
                       
        //1bit stop, normal mode    //----for UMR2----//      
                /**  CAUTION!!! UMR1 and UMR2 share a common address,
                 ** so it is a must to read or written when the mode register pointer points to it,
                 **  which occurs after any access to UMR1.  And UMR2 accesses do not update the pointer.
                 **/
                MCF_UART_UMR(channel) |= (0
                                                                | MCF_UART_UMR_CM_NORMAL
                                                                | MCF_UART_UMR_SB_STOP_BITS_1);
                                        

        //set buadrate
                div = (sys_clk/32/baudrate);
                d = div;
                MCF_UART_UBG1(channel) = (uint8)((div & 0xff00) >> 8);//high 8bit
                MCF_UART_UBG2(channel) = (uint8)(div & 0x00ff);//low 8bit
                a = (uint8)((div & 0xff00) >> 8);
                b = (uint8)(div & 0x00ff);               
                //Enable Tx/Rx
                MCF_UART_UCR(channel) = (0
                                         | MCF_UART_UCR_TX_ENABLED
                                         | MCF_UART_UCR_RX_ENABLED);
        }

        void uart_putchar(uint8 channel, char c)
        {
        //Wait until space is available in the FIFO
            while (!(MCF_UART_USR(channel) & MCF_UART_USR_TXRDY))
            {;}
            //Send the character
            MCF_UART_UTB(channel) = (unsigned char) c;
        }

        unsigned char uart_getchar(uint8 channel)
        {
        //Wait until character has been received
            while (!(MCF_UART_USR(channel) & MCF_UART_USR_RXRDY))
            {;}
            return MCF_UART_URB(channel);       
        }
        /***********************
         * 查询指定通道是否已经收到一个字符
         * 未收到——————返回0
         * 收    到——————返回1
         ************************/
        int uart_getchar_present(uint8 channel)
        {
                return(MCF_UART_USR(channel) & MCF_UART_USR_RXRDY);
        }


        void uart_putstr(uint8 channel,char *str)
        {
                while(*str!=0)
                {
                        uart_putchar(channel, *(str++));
                }
        }

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-29 17:24 , Processed in 0.043317 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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