打印

【MSP430i2xx教程第二讲】时钟系统 & EUSCI_A_UART

[复制链接]
楼主: xlhtracy
手机看帖
扫描二维码
随时随地手机跟帖
81
734774645| | 2015-4-2 16:43 | 只看该作者 回帖奖励 |倒序浏览
我看了一下那个单片机的技术手册,跟楼主的教程对比了一下,发现了一个问题,就是串口UART可选的时钟有多种,
那个MSP430i2xxFamilyUser'sGuide.pdf的231页的结构图上,写的是通UCSSELx寄存器可以选择,UCLK,ACLK,SMCLK,SMCLK,
其中SMCLK出现两次,我觉得第四个,当寄存器位对应11时候应该是MCLK,可是我查看了头文件。如下
#define UCSSEL__UCLK           (0x0000)       /* USCI 0 Clock Source: UCLK */
#define UCSSEL__ACLK           (0x0040)       /* USCI 0 Clock Source: ACLK */
#define UCSSEL__SMCLK          (0x0080)       /* USCI 0 Clock Source: SMCLK */
没有找到串行收发器使用MCLK的证据,也就是只要这两位的,高一位是1,就是成立的, 可以记作1x.
所以不用太纠结,这个直接用库函数操作就很OK了,经过查证那个手册也是没错的,只是没有写清楚。

使用特权

评论回复
82
734774645| | 2015-4-2 16:57 | 只看该作者
我看大家都对空闲线多处理器协议那个不懂,我终于找到资料了,附上:


空闲线多处理器模式
在空闲线多处理器协议中(ADDR/IDLE MODE位为0),数据块被各数据块间的空闲时间分开,该空闲时间比块中数据帧之间的空闲时间要长。一帧后的空闲时间(1O个或更多个高电平位)表明新块的开始,每位的时间可直接由波特率的值(bit/s)计算,空闲线多处理器通信格式如图1所示。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif
  图1 空闲线多处理器通信格式
  (1)空闲线模式操作步骤
  ①接收到块起始信号后,SCI被唤醒。
  ②处理器识别下一个SCI中断。
  ③中断服务子程序将接收到的地址与接收节点的地址进行比较。
  ④如果CPU的地址与接收到的地址相符,则中断服务子程序清除SLEEP位,并接收块中剩余的数据。
  ⑤如果CPU的地址与接收到的地址不符,则SLEEP位仍保持在置位状态,直到检测到下一个数据块的开始,否则CPU都不会被SCI端口中断,继续执行主程序。
  (2)块起始信号
  有两种方法发送块的开始信号。
  方法1:特意在前后两个数据块之间增加lO位或更多位的空闲时间。
  方法2:在写SCITXBUF寄存器之前,SCI口首先将TXWAKE位(SCICTL1,位3)置1。这样就会自动发送11位的空闲时间。在这种模式中,除非必要,否则串行通信线不会空闲。在设置TXWAKE后发送地址数据前,要向SCITXBUF写入一个无关的数据,以保障能够发送空闲时间。
  (3)唤醒暂时(WUT)标志
  与TXWAKE位相关的是唤醒暂时(WUT)标志位,这是一个内部标志,与TXWAKE构成双缓冲。当TXSHF从SCITXBUF装载时,WUF从TXWAKE装入,TXWAKE清0。如图2所示。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.gif
  
图2 双缓冲的WUT和TXSIIF
  (4)块的发送开始信号
  在块传送过程中需要采用下列步骤发送块开始信号:
  ①写1到TXWAKE位。
  ②为发送一个块开始信号,写一个数据字(内容不重要)到SCITXBUF寄存器。当块开始信号被发送时,写入的数据字被禁止,且在块开始信号发送后被忽略。当TXSHF(发送移位寄存器)再次空闲后,SCITXBUF寄存器的内容被移位到TXSHF寄存器,TXWAKE的值被移位到WUT中,然后TXWAKE被清除。由于TXWAKE置1,在前一帧发送完停止位后,起始位、数据位和奇偶校验位被发送的11位空闲位取代。
  ③写一个新的地址值到SCITXBUF寄存器。
  在传送开始信号时,必须先将一个无关数据写入SCITXBUF寄存器,从而使TXWAKE位的值能被移位到WUT中。由于TXSHF和WUT都是双级缓冲,在无关数据字被移位到TX-SHF寄存器后,才能再次将数据写入SCITXBUF。
(5)接收器操作
  接收器的操作和SLEEP位无关,然而在检测到一个地址帧之前,接收器并不对RXRDY位和错误状态位置位,也不申请接收中断。




使用特权

评论回复
83
734774645| | 2015-4-2 16:58 | 只看该作者
本帖最后由 734774645 于 2015-4-2 17:01 编辑

[size=13.6842107772827px]另外百度百科的地址线,就是讨论课程中的这个问题[size=13.6842107772827px]-----------------------------------------------------------------
地址线
地址线是用来传输地址信息用的。举个简单的例子:cpu在内存或硬盘里面寻找一个数据时,先通过地址线找到地址,然后再通过数据线将数据取出来。 如果有32根.就可以访问2的32次方的空间,也就是4GB。在地址位多处理器协议中(ADDR/IDLE MODE位为1),最后一个数据位后有一个附加位,称之为地址位。数据块的第一个帧的地址位设置为1,其他帧的地址位设置为0。地址位多处理器模式的数据传输与数据块之间的空闲周期无关(参看图在SCICCR寄存器中的位3——ADDR/IDLE MODE位)。
TXWAKE位的值被放置到地址位,在发送期间,当SCITXBUF寄存器和TXWAKE分别装载到TXSHF寄存器和WUT中时,TXWAKE清0,且WUT的值为当前帧的地址位的值.因此,发送一个地址需要完成下列操作:
●TXWAKE位置1,写适当的地址值到SCITXBUF寄存器。当地址值被送到TXSHF寄存器又被移出时,地址位的值被作为1发送。这样串行总线上其他处理器就读取这个地址。
●TXSHF和WUT加载后,向SCITXBUF和TXWAKE写入值(由于TXSHF和WUT是双缓冲的,它们能被立即写入)。
●TXWAKE位保持0,发送块中无地址的数据帧。
图 地址位多处理器通信格式
一般情况下,地址位格式应用于11个或更少字节的数据帧传输。这种格式在所有发送的数据字节中增加了一位(1代表地址帧,0代表数据帧);通常12个或更多字节的数据帧传输使用空闲线格式。
(1)地址字节
发送节点(Talker)发送信息的第一个字节是一个地址字节,所有接收节点(Listener)都读取该地址字节。只有接收数据的地址字节同接收节点的地址字节相符时,才能中断接收节点。如果接收节点的地址和接收数据的地址不符,接收节点将不会被中断,等待接收下一个地址字节。
(2)Sleep位
连接到串行总线上的所有处理器都将SCI SLEEP位置1(SCICTL1的第二位),这样只有检测到地址字节后才会被中断。当处理器读到的数据块地址与用户应用软件设置的处理器地址相符时,用户程序必须清除SLEEP位,使SCI能够在接收到每个数据字节时产生一个中断。
尽管当SLEEP位置1时接收器仍然工作,但它并不能将RXRDY、RXINT或任何接收器错误状态位置1,只有在检测到地址位且接收的帧地址位是1时才能将这些位置1。SCI本身并不能改变SLEEP位,必须由用户软件改变。
(3)识别地址位
处理器根据所使用的多处理器模式(空闲线模式或地址位模式),采用不同的方式识别地址字节,例如:
●空闲线模式在地址字节前预留一个静态空间,该模式没有额外的地址/数据位。它在处理包含lO个以上字节的数据块传输方面比地址位模式效率高。空闲线模式一般用于非 多处理器的SCI通信。
●地址位模式在每个字节中加入一个附加位(也就是地址位)。由于这种模式数据块之间不需要等待,因此在处理小块数据时比空闲线模式效率更高。
(4)控制SCI TX和RX的特性
用户可以使用软仵通过ADDR/IDLE MODE位(SCICCR,位3)选择多处理器模式,两种模式都使用TXWAKE(SCICTL1,位3)、RXWAKE(SCIRXST,位1)和SLEEP标志位(SCICTL1,位2)控制SCI的发送器和接收器的特性。
(5)接收步骤
在两种多处理器模式中,接收步骤如下:
①在接收地址块时,SCI端口唤醒并申请中断(必须使能SCICTL2的RX/BK INT ENA位申请中断),读取地址块的第一帧,该帧包含目的处理器的地址。
②通过中断检查接收的地址启动软件例程,然后比较内存中存放的器件地址和接收到数据的地址字节。
③如果上述地址相吻合表明地址块与DSP的地址相符,则CPU清除SLEEP位并读取块中剩余的数据;否则,退出软件子程序并保持SLEEP置位,直到下一个地址块的开始才接收中断。

使用特权

评论回复
84
quray1985| | 2015-4-2 17:13 | 只看该作者
非常棒啊
看看这款单片机符合我的要求不
一个spi,两个串口,一个I2C

使用特权

评论回复
85
h615| | 2015-4-2 17:34 | 只看该作者
来混个奖品

使用特权

评论回复
86
h615| | 2015-4-2 17:35 | 只看该作者
以前用4位机的,现在多32位机,好高端

使用特权

评论回复
87
月下飞鸿| | 2015-4-2 17:35 | 只看该作者
kqh1120 发表于 2015-4-2 00:26
//前面初始化和例程相同
EUSCI_A_UART_ initParam uartConfig = {
EUSCI_A_UART_ CLOCKSOURCE SMCLK, // SM ...

虽然我个人没学习过430,但是昨晚在考虑这个程序的时候,觉得你这个串口收发的有点问题
if(EUSCI_A_UART_receiveData (EUSCI_A0_BASE)=="LED_OFF")
else if(EUSCI_A_UART_receiveData (EUSCI_A0_BASE)=="LED_ON")
else if(EUSCI_A_UART_receiveData (EUSCI_A0_BASE)=="LED_TEST")
这三条指令感觉是有点问题的,我用过STC单片机的,串口收发都是按照位来进行的,你这样直接判断接收到的语句是否能用?

使用特权

评论回复
88
hanzhenfei| | 2015-4-2 17:45 | 只看该作者
楼上说的没错,这种写法肯定编译不过去。只不过作者这样写就只是判断一下,意思一下而已。明白就行了。

使用特权

评论回复
89
数码小叶| | 2015-4-2 17:45 | 只看该作者
734774645 发表于 2015-4-2 16:29
看来是你屏幕小了,我的24寸宽屏,看着爽歪歪, 你的电脑不好是窄屏吧。 ...

笔记本

使用特权

评论回复
90
数码小叶| | 2015-4-2 17:47 | 只看该作者
734774645 发表于 2015-4-2 16:57
我看大家都对空闲线多处理器协议那个不懂,我终于找到资料了,附上:

我发了那个i2系列的空闲模式,你可以看下;P

使用特权

评论回复
91
734774645| | 2015-4-2 18:06 | 只看该作者
数码小叶 发表于 2015-4-2 17:47
我发了那个i2系列的空闲模式,你可以看下

嗯,是的,刚才看了,你好认真啊,看来你每次都要拿大奖了。恭喜贺喜。:lol中奖多了,分点呗。

使用特权

评论回复
92
董自祝| | 2015-4-2 18:07 | 只看该作者
个人认为讲的太详细了。多给定图形化的讲解,那该多好 啊

使用特权

评论回复
93
734774645| | 2015-4-2 18:14 | 只看该作者
经过认真的学习课程和观察库函数以及例程文件,终于知道baseAddress是什么了。
比如库函数中总是出现,例如
[size=13.6842107772827px]void [size=13.6842107772827px]EUSCI_A_UART_disable[size=13.6842107772827px] (uint16_t baseAddress)
这个很简单吧,我刚一看真不知道这个baseAddress是什么,后来看了后面的内容,原来只不过是个参变量,哎,脑子秀逗了,这个跟随便写个ABC,没什么区别。
只不过所有的基地址都起了这个名字,对应不同的外设时候才有不同的常量名字。比如在UART模块对应的基地址是EUSCI_A0_BASE
在IIC里面对应的基地址是EUSCI_B0_BASE
这下明白了。谢谢版主的教程。以后学习430看来更简单了。

使用特权

评论回复
94
734774645| | 2015-4-2 18:14 | 只看该作者
董自祝 发表于 2015-4-2 18:07
个人认为讲的太详细了。多给定图形化的讲解,那该多好 啊

:lol那以后要求版主出视频讲解。

使用特权

评论回复
95
董自祝| | 2015-4-2 18:50 | 只看该作者
734774645 发表于 2015-4-2 18:14
那以后要求版主出视频讲解。

相当好,视频最适合入门

使用特权

评论回复
96
数码小叶| | 2015-4-2 18:55 | 只看该作者
734774645 发表于 2015-4-2 18:06
嗯,是的,刚才看了,你好认真啊,看来你每次都要拿大奖了。恭喜贺喜。中奖多了,分点呗。 ...

想多了,没中过:L:L:L,只是这种讨论式比自己闷着头学好的多,比较认同这种方式

使用特权

评论回复
97
734774645| | 2015-4-2 18:57 | 只看该作者
董自祝 发表于 2015-4-2 18:50
相当好,视频最适合入门

我看这个教程定位可不是入门而已,我觉得,起码是了解了一点点MSP430开发才能搞,多亏我以前学过MSP430G2xx,呵呵。

使用特权

评论回复
98
734774645| | 2015-4-2 18:59 | 只看该作者
数码小叶 发表于 2015-4-2 18:55
想多了,没中过,只是这种讨论式比自己闷着头学好的多,比较认同这种方式 ...

我也认同,这样版主的教程作为引导,大家一起讨论,把难懂的,概念模糊不清的,说出来,等活动结束,估计修订版应该很给力。

使用特权

评论回复
99
数码小叶| | 2015-4-2 19:17 | 只看该作者
734774645 发表于 2015-4-2 18:59
我也认同,这样版主的教程作为引导,大家一起讨论,把难懂的,概念模糊不清的,说出来,等活动结束,估计 ...

嗯,大家共同学习:lol:lol:lol

使用特权

评论回复
100
mintspring| | 2015-4-2 22:14 | 只看该作者
月下飞鸿 发表于 2015-4-2 17:35
虽然我个人没学习过430,但是昨晚在考虑这个程序的时候,觉得你这个串口收发的有点问题
if(EUSCI_A_UART_ ...

你说的很对,这根本不会收到一个字符串,一次只能收到一个字符,对吧?

使用特权

评论回复
发新帖 本帖赏金 5.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则