7965|9

72

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

SPI与中断服务的问题 [复制链接]

WDTCTL = WDTPW + WDTHOLD;
BCSCTL1 = CALBC1_8MHZ;
DCOCTL = CALBC1_8MHZ; //主系统选择8M频率
TBCTL |= TBSSEL1; //选择ACLK(辅助时钟)作为TB时钟源
UCA0CTL1 |= UCSSEL_2; //选择SMCLK(子系统时钟)作为SPI时钟源
UCA0BR0 |= 0x10; // 根据所选时钟频率(8M)除以所需要的波特率(500K)
在这种情况下,程序运行到TB中断服务程序时, 导致正在工作的SPI接口停止,而导致接收到错误值.
请问高手们,保持SPI波特率500K的情况下,有什么方法可以使俩者(SPI与TB中断)互不相关?

最新回复

我想知道中断允许后,spi的接收中断,就是接收完一个字节,就会进入接收中断吗,中断程序里要不要接收标志清0啊  详情 回复 发表于 2012-7-15 11:12
 
点赞 关注

回复
举报

86

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
430在中断时默认是不嵌套的,

可在TB中断程序中开中断 __ena××e_interrupt(),允许SPI中断
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
SPI 我是用查询方式做的,还望再次指点......
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

4
 
SPI速率高,查询方式是好方法,还是用中断方式好.查询是无法保证SPI得到及时响应的.

首先将TB和SPI都置为中断允许,并置位GIE来开中断,


当TB中断时,在中断程序的开头置GIE再次开中断,以响应执行TB中断的过程中SPI产生的中断.如果在TB中断执行过程中无SPI中断,这方案了无不妥.

在我的一个MSP430F1232系统中,我用这方法成功进行SPI通讯,并有TA,P1口等多个中断源同时工作.
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

5
 
高手明签..我这个工程也有到了许多中断.SPI就是与CC2500相接..我刚从51转到430不久...对于SPI用中断方式一时还没领悟过来该怎么改写这段程序...请多请教...谢谢
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

6
 
CC2500不熟悉.

430和CC2500,哪一个是SPI时的MASTER?

430收到CC2500的一个准备好的信号后,发起SPI通讯读CC2500的数据吗?


下面是MSP430F123中SPI MASTER方式中的初始化部份,仅供参考:
void SPI_Init( void )
{
P3SEL |= SIMO + SOMI + UCLK ; ///*1--module function

U0CTL |= SWRST ;

U0CTL = CHAR + //Character length = 8-bits
SYNC + //Synchronous mode ena××e = SPI mode
//MM=0 , USART is sl××e
SWRST ; //Software Reset . When set, the SWRST bit resets the URXIEx, UTXIEx, URXIFGx, OE, and
//FE bits and sets the UTXIFGx flag.

#ifdef SPI_MASTER
U0CTL |= MM ; //MM=1 , USART is master
U0TCTL = SSEL0 + //BRCLK source clock = ACLK (valid for master mode only)
STC ; //Sl××e transmit control.3-pin SPI mode: STE disa××ed.
#else
U0TCTL = STC ; //Sl××e transmit control.3-pin SPI mode: STE disa××ed.
#endif

U0BR0 = 0x002 ; // SPICLK = ACLK/2 , Unpredicta××e SPI operation occurs if UxBR < 2.
U0BR1 = 0x000 ;
U0MCTL = 0x000 ; //The modulation control register is not used for SPI mode
//and should be set to 000h.

ME2 |= USPIE0 ; // Module ena××e

U0CTL &= ( ~SWRST ) ; // SPI ena××e, ready to receive


#ifdef SPI_MASTER
IE2 |= UTXIE0 ; // master transmit interrupt ena××e
#endif

IE2 |= URXIE0 ; // sl××e Receive interrupt ena××e
}
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

7
 
430是SPI MASTER
430 通过SPI 可单读/写 或 连续读写CC2500的内容,我一时间想不到该如何把查询方式改为中断方式..可以的话,你把你那段SPI 中断程序或者SPI发送接收程序截一段给我借签借签吗....
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

8
 
谢谢,兄台
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

9
 
我对CC2500不熟悉,无法更具体地说要做什么。
下面是我有项目中SPI通讯的程序片段,供参考。///用TA0中断,启动ADC10进行AD转换,再在ADC10的中断中将ADC的结果保存到数组ADC_Queue。当数组满时,启动SPI传输数据到外部SPI SL××E 。///
//*****************************************************************************
#pragma vector=USART0TX_VECTOR
__interrupt void SPI_Master_Transmit( void )
{
IE2 &= ( ~UTXIE0 ) ; // master transmit interrupt disa××e
U0TXBUF = *pADC_Queue ;//start transmittion
}

/*********************************************************/
#pragma vector=USART0RX_VECTOR
__interrupt void SPI_Master_Receive(void)
{
if( ++pADC_Queue >= ( unsigned char* )( Master_ADC_Queue + AD_CHANNEL_COUNT ) )
{
ME2 &= ( ~USPIE0 ) ; // Module ena××e
U0CTL |= SWRST ;
}
else
{
Start_TA1_Delay() ;
}
}

//*****************************************************************************
#pragma vector=TIMERA1_VECTOR
__interrupt void TA1_INT (void)//每6ms中断一次
{
CCTL1 = 0 ;
IE2 |= UTXIE0 ; // master transmit interrupt ena××e
}

//*****************************************************************************
#pragma vector=TIMERA0_VECTOR
__interrupt void TA0_INT (void)//每6ms中断一次
{
CCR0 += NEXT_TIME ;
ADC10_Start() ;
}


//*****************************************************************************
#pragma vector=USART0RX_VECTOR
__interrupt void SPI_Sl××e_Receive (void)///listen to
{
U0TXBUF = *pADC_Queue = U0RXBUF ;
}
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(中级)

10
 

spi中断程序

我想知道中断允许后,spi的接收中断,就是接收完一个字节,就会进入接收中断吗,中断程序里要不要接收标志清0啊
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表