[原创] 【R7F0C809】----深入理解(3)挺烦人的串行接口

youki12345   2015-10-18 11:42 楼主
现在的单片机很多引脚都是复用的,RF7当然也不例外,特别是串行接口,这点TI与RF7挺像的,都是一个具有多个功能的、可以供用户选择的串行矩阵:即一个接口可以支持多种串行总线,例如IIC,UART,SPI等。当然,这些总线是不同同时使用的,必须指定其中某个!
1.png
下面我们来看看手中的这块R7F到底支持哪些串行接口,图1对这块芯片所支持的串行接口有个详细的介绍,可以这块芯片支持2个CSI或2个UART或2个IIC。由于我们现在讨论的是UART,那当然我们来看看R7F的UART以及如何使用。
R7F UART的特点:
1.支持7位,8位,9位数据位
2.可以选择MSB或LSB
3.可以选择接收数据或发送数据时电平的翻转
4.支持校验位和停止位
5.支持发送缓冲区空中断以及各种错误检测。
可以看出R7F还是很有特点的,特别是支持MSB或LSB以及接收或发送的电平翻转!
移位寄存器?
文档中很多地方都提到移位寄存器,那么为什么在串行接口这一章中对移位寄存器如此重视呢?学过数字电路的同学都支持,串行就是一位一位的往外发数据,而大多数CPU内部进行数据通信的时候确实并行的,因此要有个并行到串行的转换过程,而并行转串行最简单的方法就是利用移位寄存器!
为了要使用R7F的UART,那就必须对R7F的寄存器进行配置,通常来说,配置就是从以下几个方面下手:时钟,工作模式,是否开启等等。
2.png 图2是瑞萨官方给出的UART配置顺序与寄存器。其实还是挺简单的。下面我们就结合代码来看看到底如何配置UART0。在官方给出的例子中,配置UART0主要是下面两个函数,开始SAU0及开启UART0.
void R_SAU0_Create(void)
{
    SAU0EN = 1U;        /* supply SAU0 clock */
    NOP();
    NOP();
    NOP();
    NOP();
    SPS0 = 0x44U;       /* ck00 - fCLK/2^4; ck01 - fCLK/2^4 */
    R_UART0_Create();
}
首先是开启SAU0,其实这个函数比较简单,就是开始该模块的时钟,最后调用R_UART0_CRTEATE函数配置串行接口。而R_UART0_CRTEATE就相对复杂许多,这也是我们讲解的重点。
void R_UART0_Create(void)
{
    ST0 |= 0x03U;       /* disable UART0 receive and transmit */
//首先关闭串口,便于后面配置
    STMK0 = 1U;         /* disable INTST0 interrupt */
    STIF0 = 0U;         /* clear INTST0 interrupt flag */
    SRMK0 = 1U;         /* disable INTSR0 interrupt */
    SRIF0 = 0U;         /* clear INTSR0 interrupt flag */
    SREMK0 = 1U;        /* disable INTSRE0 interrupt */
    SREIF0 = 0U;        /* clear INTSRE0 interrupt flag */
//关闭各种中断函数,例如 接收中断,发送中断以及总中断等等。
    /* Set INTST0 low priority */
    STPR10 = 1U;
    STPR00 = 1U;
    /* Set INTSR0 low priority */
    SRPR10 = 1U;
    SRPR00 = 1U;
    /* Set INTSRE0 low priority */
    SREPR10 = 1U;
    SREPR00 = 1U;
//设定中断的优先级,其实这段话可以不要,那就是以默认优先级
    SMR00H = 0x00U;     /* selection of macro clock (MCK) of channel 0: operation clock CK00 set by SPS0 register */
    SMR00L = 0x22U;     /* setting of operation mode of channel 0: UART mode */
                        /* selection of interrupt source of channel 0: transfer end interrupt */
    SCR00H = 0x82U;     /* setting of operation mode of channel 0: transmission only */
                        /* selection of masking of error interrupt signal: masks error interrupt INTSRE0 */
                        /* setting of parity bit in UART mode: even parity*/
    SCR00L = 0x97U;     /* selection of data transfer sequence in CSI and UART modes: LSB */
                        /* setting of stop bit in UART mode: 1 stop bit */
                        /* setting of data length in CSI and UART modes: 8-bit data length */
//设置UART的起始位,校验位,停止位等等。
    SDR00H = 0x80U;     /* setting of baud rate: 9600bps */  
//用来确定波特率是多少,该值得具体计算方式可以看下面的图3
    SIR01 = 0x07U;      /* clear error flag */
    SMR01H = 0x01U;     /* selection of macro clock (MCK) of channel 1: operation clock CK0 set by PRS register */
                        /* selection of start trigger source: valid edge of RXD pin */
    SMR01L = 0x22U;     /* controls inversion of level of receive data of UART0: falling edge is detected as the start bit */
                        /* setting of operation mode of channel 1: UART mode */
    SCR01H = 0x46U;     /* setting of operation mode of channel 0: reception only */
                        /* selection of masking of error interrupt signal: masks error interrupt INTSRE0 */
                        /* setting of parity bit in UART mode: even parity*/
    SCR01L = 0x97U;     /* selection of data transfer sequence in CSI and UART modes: LSB */
                        /* setting of stop bit in UART mode: 1 stop bit */
                        /* setting of data length in CSI and UART modes: 8-bit data length */
    SDR01H = 0x80U;     /* setting of baud rate: 9600bps */
    NFEN0 |= 0x01U;     /* use of noise filter: noise filter on */

    SOL0 &= 0xFEU;      /* output level normal */
    SO0 |= 0x01U;       /* Serial data output of channel 0 is "1" */
    SOE0 |= 0x01U;      /* enable UART0 output */

    /* Set RxD0 pin */
    PMC0 &= 0x7FU;
    PM0 |= 0x80U;
    /* Set TxD0 pin */
    P0 |= 0x40U;
    PM0 &= 0xDFU;
}
3.png


https://bbs.eeworld.com.cn/thread-471646-1-1.html 欢迎加入我的团队

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复