谁有iar for msp430教程的教程啊?发给。谢啦

更多公众号:gh_dc70a7510677欢迎关注单片机及C语言学习最新文章对这篇文章不满意?您可以继续搜索:百度:搜狗:感谢您阅读MSP430初学者教程(最详细),本文可能来自网络,如果侵犯了您的相关权益,请联系管理员。QQ:SPI总线系统是一种同步串行外设接口;是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。 许多的芯片都用这种协议通信:EEPROM、Flash、实时时钟、AD转换器、数字信号处理器等:MSP430的USART模块不仅能够实现异步模式(见:),而且支持同步串行通信(即SPI模式);其SPI支持3线、4线操作,支持主机模式和从机模式,字符长度可以7位或8位等。由于要用AD7708芯片完成AD采样,AD7708是通过SPI与其它设备通信的;本程序比较简化,只完成了主机模式的初始化。
硬件介绍:
SPI:SPI是Motorola首先在其MC68HCXX系列处理器上定义的,它是一种同步的高速串行通信协议,有关SPI协议的详细内容,参考:。
MSP430对SPI的支持:当msp430USART模块控制器UxCTL的位SYNC置位时,USART模块工作于同步模式,对于149即工作于SPI模式,若是169,USART0可以支持I2C,可以通过另一控制位I2C控制,I2C位0则工作于SPI。在SPI模式下,允许单片机以确定的速率发送和接收7位或8位数据。
同步通信与异步通信类似;同步通信和异步通信寄存器资源一致,具体寄存器的不同位之间的功能存在差异;具体寄存器内容参见TI提供的用户指南。
USART模块的SPI操作可以是3线和4线,其信号如下:
SIMO:从进主出,主机模式下,数据输出;从机模式下,数据输入。
SOMI:从出主进,主机模式下,数据输入;从机模式下,数据输出。
UCLK:USART SPI模式时钟,信号有主机输出,从机输入。
STE:从机模式发送接收允许控制脚,用于4线模式,控制多主从系统中多个从机,避免发生冲突。具体方式如下(图截自 用户指南):
四线主机模式:STE为高电平,SIMO和UCLK操作正常;STE为低电平,SIMO和UCLK被置为输入方向,主机控制权让出。
四线从机模式:STE为高电平,从机的发送和接收无效,且把SOMI置为输入方向;STE为低电平,发送接收正常,SOMI也为正常输出。
USART模块串行时钟极性和相位设置:
USART的时钟UCLK的极性和相位由位于UxTCTL寄存器的CKPH和CKPL位控制,具体如下图:在程序中,我分别称之为,时钟模式0、时钟模式1、时钟模式2、时钟模式3。
USART的波特率产生,SPI不同于异步通信:异步通信由UxBR1\UxBR0\UxMCTL三个寄存器控制,以产生标准频率;而同步模式,主从设备用同一个时钟,不再需要产生标准时钟,故而不再用UxMCTL寄存器,设其值为0.
其他的,与异步通信基本一致,这里不再细说。具体参考用户指南。
程序实现:
程序和异步通信方式类似:首先是初始化函数,然后是读取数据、写入数据函数。此程序采用和我之前的UART程序库类似的结构,写入数据后进入低功耗等待中断,判断标志位进行写入数据和读取数据。
这里函数只实现430的主机模式,如需从机模式可以仿照我的程序,进行简化实现。
由于,我即将使用的SPI设备(AD7708)不是字符型设备,这里不再实现写入字符串函数,也不再移植printf和scanf函数,如若需要可以自己添加,printf和scanf的移植参考:
初始化函数:SpiMasterInit,实现主机模式的初始化工作,函数内容如下:
char SpiMasterInit(long baud,char dataBits,char mode,char clkMode)
//波特率发生器时钟频率
UxCTL |= SWRST;
//反馈选择位,为1,发送的数被自己接收,用于测试,正常使用时注释掉
//UxCTL |= LISTEN;
UxCTL |= SYNC + MM;
//SPI 主机模式
//时钟源设置
UxTCTL &=~ (SSEL0+SSEL1);
//清除之前的时钟设置
if(baud&=16364)
UxTCTL |= SSEL0;
//ACLK,降低功耗
brclk = 32768;
//波特率发生器时钟频率=ACLK(32768)
UxTCTL |= SSEL1;
//SMCLK,保证速度
brclk = 1000000;
//波特率发生器时钟频率=SMCLK(1MHz)
//------------------------设置波特率-------------------------
if(baud & 300||baud & 115200)
//波特率超出范围
//设置波特率寄存器
int fen = brclk /
//分频系数
if(fen&2)return (0);
//分频系数必须大于2
UxBR0 = fen / 256;
UxBR1 = fen % 256;
//------------------------设置数据位-------------------------
switch(dataBits)
case 7:case'7': UxCTL &=~ CHAR; break;
case 8:case'8': UxCTL |= CHAR;
return(0);
//参数错误
//------------------------设置模式---------------------------
switch(mode)
case 3:case'3': UxTCTL |= STC;
//三线模式
case 4:case'4': UxTCTL &=~ STC; USPI4ON;
//四线模式
return(0);
//参数错误
//------------------------设置UCLK模式-----------------------
switch(clkMode)
case 0:case'0': UxTCTL &=~ CKPH; UxTCTL &=~ CKPL;
case 1:case'1': UxTCTL &=~ CKPH; UxTCTL |= CKPL;
case 2:case'2': UxTCTL |= CKPH;
UxTCTL &=~ CKPL;
case 3:case'3': UxTCTL |= CKPH;
UxTCTL |= CKPL;
return(0);
//参数错误
UxME |= USPIEx;
//模块使能
UCTL0 &= ~SWRST;
// Initialize USART state machine
UxIE |= URXIEx + UTXIEx;
// Enable USART0 RX interrupt
return(1);
//设置成功
程序注释已经比较详细,这里不再细说;如果要改为从机模式,把时钟设置和波特率设置去掉应该就可以了。
发送函数和接收函数:
void SpiWriteDat(char c)
while (TxFlag==0) SpiLpm();
// 等待上一字节发完,并休眠
UxTXBUF=c;
char SpiReadDat()
while (RxFlag==0) SpiLpm(); // 收到一字节?
return(UxRXBUF);
发送和接收函数和异步通信里面的几乎一样,如果标志位为0,则等待改变为1,然后写入或读出;标志位在中断函数里被更改;中断函数如下:
#pragma vector=USARTxRX_VECTOR
__interrupt void UartRx()
__low_power_mode_off_on_exit();
#pragma vector=USARTxTX_VECTOR
__interrupt void UartTx ()
__low_power_mode_off_on_exit();
中断里面仅仅置标志位后,就退出低功耗;退出后即写入或者读取数据。
读取或写入函数调用的SpiLpm函数:
void SpiLpm()
if(UxTCTL&SSEL0) LPM3;
//若以ACLK 作时钟,进入LPM3休眠(仅打开ACLK)
//若以SMCLK作时钟,进入LPM0休眠(不关闭SMCLK)
根据不同情况进入低功耗,如果单片机其他地方不允许进入低功耗,可以更改这个函数。
程序部分就这么多了。需要的函数在头文件里面声明,方便使用。
使用示例:
程序使用方式和之前的程序库相同,加入c文件,包含h文件,调用初始化函数后即可掉用程序库中的函数。
#include &msp430x16x.h&
//430寄存器头文件
#include &Spi.h&
//串口通讯程序库头文件
void main()
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
ClkInit();
// 主机模式,波特率25000,8位数据位,三线模式,时钟模式0(具体见spi.c)
SpiMasterInit(,0);
//串口测试
SpiWriteDat(0X20);
char a = SpiReadDat();
这里只是一个简单的使用示例,详细的使用,将会在下一篇给出,下一篇:;将会使用今天的程序库,完成SPI的通信部分。
注意事项:
SPI是全双工通信,每次写入(发送)8位/7位数据的同时,430的SPI主模块都会在发送后半个时钟周期读取采样的0/1信号,存入接收缓冲寄存器,所以,每次的写入,均有数据读取,但不一定是从设备发送回来的,这个地方在使用430主机模式的时候必须注意,很容易出错(我也是在调试AD7708的时候才注意到这个地方的);SPI的函数已经添加SpiWriteData函数,这个函数会在发送的同时返回发送完成半个时钟周期后的接收到的数据,方便使用;不建议使用前面的发送和读取函数,很容易出错;建议使用刚添加的这个函数,程序库已经更新,可以重新下载。函数SpiWriteData:
char SpiWriteData(char c)
SpiWriteDat(c);
return SpiReadDat();
发送后读取即可,程序比较简单。
新的示例程序:
void main()
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
ClkInit();
// 主机模式,波特率25000,8位数据位,三线模式,时钟模式0(具体见spi.c)
SpiMasterInit(,0);
//串口测试
SpiWriteData(0X20);
char a = SpiWriteData(0xff);
详细示例,参参考下一篇:
SPI的通信部分完成,有什么不足,欢迎讨论。谢啦!
本文版权归作者和博客园共有,欢迎转载,转载保留此段文字并且注明出处;谢谢。
阅读(...) 评论()MSP430单片机串口通信详解
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
MSP430单片机串口通信详解
#include&msp430G2553.h&
#include &in430.h&
void UartPutchar(unsigned char c);
unsigned char UartGetchar();
unsigned char temp=0;
unsigned char number[2]={0};
void main( void )
& WDTCTL = WDTPW + WDTHOLD; & & & & & & & & // Stop WDT
& BCSCTL1 = CALBC1_1MHZ; & & & & & & & & & &// Set DCO
& DCOCTL = CALDCO_1MHZ;
& P1DIR|=BIT6;
& P1OUT&=~BIT6;
& P1SEL = BIT1 + BIT2; & & & & & & & & & & &// P1.1为 RXD, P1.2为TXD
& P1SEL2 = BIT1 + BIT2; & & & & & & & & & & // P1.1为 RXD, P1.2为TXD
& UCA0CTL1 |= UCSSEL_2; & & & & & & & & & & // 选择时钟BRCLK
& UCA0BR0 = 106; & & & & & & & & & & & & & &// 1MHz 9600
& UCA0BR1 = 0; & & & & & & & & & & & & & & &// 1MHz 9600
& UCA0MCTL = UCBRS2 + UCBRS0; & & & & & & & // 波特率=BRCLK/(UBR+(M7+...0)/8)
& UCA0CTL1 &= ~UCSWRST; &
& // 初始化顺序:SWRST=1设置串口,然后设置SWRST=0,最后设置相应中断
& IE2 |= UCA0RXIE; & & & & & & & & & & & & &// 使能接收中断
& &//UartPutchar(9);
& &// display_int(temp,0);
& & __delay_cycles(10000);
/**********************************UART接收中断*************************/
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
& //while (!(IFG2&UCA0TXIFG)); & & & & & & & &// 等待发送完成
& //UCA0TXBUF = UCA0RXBUF; & & & & & & & & & &// TX -& RXed character
& temp=UCA0RXBUF;
/******************************UART发送字节函数*************************/
void UartPutchar(unsigned char c)
&while(!(IFG2 & UCA0TXIFG)); &//待发送为空
&UCA0TXBUF=c;
&IFG2 &=~UCA0RXIFG;
/*********************************UART接收字节数据******************/
unsigned char UartGetchar()
& while(!(IFG2 & UCA0RXIFG)); //等待接收完成
& c=UCA0RXBUF;
& IFG2 &=~UCA0TXIFG;
/******智能控制工作室*******/
&&&MSP430g2553串口通信
MSP430的不同型号,其串行通讯工作模式是一样的。以MSP430G2553为例进行说明。MSP430G2553是20个引脚的16位单片机。具有内置的16位定时器、16k的FLASH和512B的RAM,以及一个通用型模拟比较器以及采用通用串行通信接口的内置通信能力。此外还具有一个10位的模数(A/D)转换器。其引脚排布如图1.1所示。其功能表如表1.1所示。
串行通讯模块主要由三个部分组成:波特率生成部分、发送控制器以及接收控制器。如图1.2所示。
一、UART模式
在异步模式下,接收器自身实现帧的同步,外部的通讯设备并不使用这一时钟。波特率的产生是在本地完成的。异步帧格式由1个起始位、7或8个数据位、校验位(奇/偶/无)、1个地址位、和1或2个停止位。一般最小帧为9个位,最大为13位。
(一)UART的初始化
单片机工作的时钟源来自内部三个时钟或者外部输入时钟,由SSEL1、SSEL0,以决定最终进入模块的时钟信号BRCLK的频率。所以配置串行通讯的第一步就是选择时钟。
通过选择时钟源和波特率寄存器的数据来确定位周期。所以波特率的配置是串行通讯中最重要的一部分。波特率设置用三个寄存器实现:UxBR0(选择控制器0):波特率发生器分频系数低8位。UxBR1(选择控制器1):波特率发生器分频系数高8位。UxMCTL
数据传输的格式,以及数据传输的模式是通过配置控制寄存器UCTL来进行设置。
接收控制部分和发送控制部分。首先需要串行口进行配置、使能以及开启中断。串口接收数据一般采用中断方式,发送数据采用主动发送。当接收到一个完整的数据,产生一个信号:URXIFG0=1(类似于51单片机的接收中断标志位),表示接收完整的数据。当数据正在发送中,UTXIFG0=1,此时不能再发送数据,必须等当前数据发送完毕(UTXIFG0=0)才能进行发送。
二、SPI模式
&&&USTAR下的SPI模式有如下特点:
1、SPI模式支持3线和4线模式;
2、支持主机与从机模式;
3、接受和发送有各自独立的发送移位寄存器和缓冲器;
4、接受和发送都有独立的中断能力;
&5、移位时钟的极性和相位可编程;
6、字符长度可以是7位或者8位。
SPI工作在全双工下,即主机发送的同时也接收数据,传输的速率由编程决定。4线SPI模式用附加数据线,允许从机数据的发送和接收。其信号如下:&SIMO:从进主出,主机模式下,数据输出;从机模式下,数据输入。SOMI:从出主进,主机模式下,数据输入,从机模式下,数据输出。UCLK:USART SPI模式时钟,信号有主机输出,从机输入。CLK时钟只能由主机提供。STE:从机模式发送接收允许控制脚,用于4线模式。
(一)SPI初始化
SPI当中不需要波特率调整,所以UxMCTL=0x0000,SPI的初始化及其复位和UART公用一套寄存器。
在初始化或者重新配置USART的SPI时,必须按照以下顺序进行:
1、UxCTL寄存器的第0位SWRST置位;
2、在SWRST置位的条件下,初始化所有的SPI寄存器,包括UxCTL寄存器;
3、通过置位模块使能寄存器MEx的URXEx和UTXEx位使能SPI的接受和发送使能模块;
4、通过软件复位UxCTL寄存器的第0位SWRST;
5、通过中断使能寄存器IEx的URXIEx和UTXIEx来使能发送和接受中断。
三、寄存器及其功能
通信模块寄存器如下:
(1)控制寄存器UxCTL
控制寄存器内的信息决定了USART的基本操作。如:选择通信协议、通信模式和校验位。在SWRST复位使USART复位操作禁止前,各位应根据选择的模式进行编程。
表3.2&&发送控制寄存器UxCTL
校验允许位
0:校验禁止
1:校验允许
奇偶校验位
停止位选择
0:1位停止位
1:2位停止位
3(LISTEN)
(选择是否发送数据由内部反馈给接收器)
USART模块的模式选择
0:UART模式(异步)
1:SPI模式(同步)
多机模式选择位
0:线路空闲多机协议
1:地址位多机协议
0(SWRST)
控制位(上电置位)
0:USART禁止
1:USART允许
(2)发送控制寄存器UxTCTL(未作说明的位未用)
寄存器UxTCTL控制与发送操作相关的USART硬件。
表3.3&&发送控制寄存器UxTCTL
时钟相位控制位
0:正常UCLK时钟
1:UCLK时钟延迟半个周期
时钟极性控制位
0:UCLKI信号与UCLK信号极性相同
1:UCLKI信号与UCLK信号极性相反
5(SSEL1)
时钟源选择
(确定波特率发生器的时钟源)
00:外部时钟UCLKI
01:辅助时钟ACLK
10:系统时钟MCLK
11:子系统时钟SMCLK
4(SSEL0)
发送控制位
0:SPI为4线模式
1:SPI为3线模式
0(TXEPT)
发送器空标志,在异步模式与同步模式时是不一样的
0:正在传输数据或者发送缓冲器(UTXBUF)有数据
1:表示发送移位寄存器和UTXBUF空或者SWRST=1
(3)接收控制寄存器URCTL
URCTL 控制与接收操作相关的USART硬件并保存由最新写入URXBUF的字符引起的出错状况和唤醒条件。若FE、PE、OE、BRK、RXERR 或 RXWake&中的任何一位置位,通过接收下一个字符不能使其复位。它们的复位要通过访问接收缓存URXBUF、USART的软件复位SWRST、系统复位PUC或用指令修改。
表3.4&&接收控制寄存器URCTL
帧错误标志位
0:无帧错误
1:有帧错误
校验错误标志位
0:校验正确
1:校验错误
溢出标志位
打断检测位
3(URXEIE)
接收出错中断允许位
0:禁止中断,不接收出错字符,不改变URXIFG标志
1:允许中断,接收出错字符,置位URXIFG标志
2(URXWIE)
接收唤醒中断允许位
0:接收的所有字符都能够置位URXIFG
1:只有接收到地址字符才置位URXIFG
1(RXWake)
接收唤醒检测位
0:未被唤醒,接收到的字符是数据
1:唤醒,接收的字符是地址
0(RXERR)
接收错误标志位
0:未接收到错误
1:接收到错误
在各种条件下URXEIE和URXWIE对URXIFG的影响:
接收字符后的标志位URXIFG
置位(&接收所&有字符)
(4)波特率选择寄存器和调制控制寄存器
波特率产生器利用波特率选择寄存器UxBR1和UxBR0,以及调整控制寄存器UxMCTL,来产生串行数据流的位定时。UxBR0、UxBR1这两个寄存器是用于存放波特率分频因子的整数部分,若波特率发生器的输入频率BRCLK不是所需波特率的整数倍,带有小数,则整数部分写入UxBR寄存器,小数部分则由调整寄存器UxMCT的内容反映。波特率由以下公式计算:
波特率=BRCLK/(UBR+(M7+M6+ &M0)/8)
寄存器各位如下:
(5)接收数据缓存URXBUF
接收缓存存放移位寄存器最后接收的字符,可由用户访问,读接收缓存可以复位接收时产生的各种错误标志、RXWAKE位和URXIFGx位。如果传输7位数据,接收缓存内容右对齐,最高位为0。当收接和控制条件为真时,接收缓存装入当前接收到的字符。
装入URXBUF
无差错地址字符
所有地址字符
无差错字符
(6)发送数据缓存UTXBUF
发送缓存含有当前要由发送器发送的数据。UTXIFG 标志表示UTXBUF已准备好接收下一个要发送的字符。将数据写入UTXBUF初始化发送功能。如果发送移位寄存器为空或即将为空,数据的发送立即开始。只有当UTXBUF为空时,数据才能写入缓存,否则可能发送不可预料的字符。
表1.1&&MSP430G2553引脚功能表
引脚功能描述
通用I/O口、ADC10模拟输入A0(1)&、Comparator_A+,CA0输入、TIMER _A时钟信号TACLK输入、ACLK信号输出
通用I/O 口、Timer0_A,捕捉:CCI0A输入,比较:Out0输出/ BSL发送、UART模式中USCI_A0接收数据输入、SPI模式中USCI_A0受控器数据输出/主控器输入、ADC10模拟输入A1 、Comparator_A+,CA1输入
通用I/O 口、Timer0_A,捕获:CCI1A输入,比较:Out1输出、UART模式中USCI_A0发送数据输出、SPI 模式中USCI_A0受控器数据输入/主控器输出、ADC10模拟输入A2、Comparator_A+,CA2输入
通用I/O 口、ADC10,转换时钟输出(1)、ADC10模拟输入A3、ADC10负基准电压、Comparator_A+,CA3输入、Comparator_A+,输出
通用I/O 口、Timer0_A,比较:Out0输出/ BSL接收、USCI_B0时钟输入/输出、USCI_A0受控器发送使能、ADC10模拟输入A5、Comparator_A+,CA5输入、JTAG测试模式选择输入终端
通用I/O 口、Timer1_A,捕获:CCI0A输入,比较:Out0输出
通用I/O 口、Timer1_A,捕获:CCI1A输入,比较:Out1输出
通用I/O 口、Timer1_A,捕获:CCI1B输入,比较:Out1输出
通用I/O 口、Timer1_A,捕获:CCI0B输入,比较:Out0输出
通用I/O 口、Timer1_A,捕获:CCI2A输入,比较:Out2输出
通用I/O 口、Timer1_A,捕获:CCI2B输入,比较:Out2输出
通用I/O 口、Timer0_A,比较:Out1输出、、ADC10模拟输入A6、Comparator_A+,CA6输入、SPI模式中USCI_B0受控器输出/主控器输入、I2C 模式中的USCI_B0SCLI2C 时钟、JTAG测试数据输入或测试时钟输入
通用I/O 口、ADC10模拟输入A7、Comparator_A+,CA7输入、Comparator_A+,输出、SPI模式中的USCI_B0受控器输入/主控器输出、I2C 模式中的USCI_B0SDAI2C 数据输入、JTAG测试数据输出终端或测试数据输入
复位、不可屏蔽中断输入、编程及测试期间的两线制(Spy-Bi-Wire) 测试数据输入/输出
为端口1上JTAG引脚选择测试模式、器件保护熔丝连接至TEST、编程及测试期间的Spy-Bi-Wire测试时钟输入
晶体振荡器的输出终端、通用I/O 口
晶体振荡器的输入终端、通用I/O 口、Timer0_A,比较:Out1输出
【】【】【】【】
上一篇:下一篇:
CopyRight @
单片机教程网
, All Rights Reserved

我要回帖

更多关于 iar for msp430教程 的文章

 

随机推荐