3205|3

222

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

LaunchPad SPI 通信 无法进中断 [复制链接]

  1. 手上有两个LaunchPad,现在从一个LaunchPad作为主机,通过SPI不断发送数据给另一个LaunchPad,接收到数据后通过SPI反馈回来,在再第一块LaunchPad接收SPI数据,并通过串口上传。但是主机在接收SPI数据的时候无法进入中断,看RXBUF寄存器确实接收到数据了。初始化有问题,但是查了半天没发现是什么问题,请大牛指点。
复制代码

从机程序
  1. #include <msp430.h>
  2. //从机,接收SPI数据返回回去,并通过串口发给电脑。
  3. unsigned char temp = 0x00;
  4. void Clk_init()
  5. {
  6.         BCSCTL1 = CALBC1_16MHZ;                    // Set DCO
  7.         DCOCTL = CALDCO_16MHZ;
  8. }
  9. void IO_init()
  10. {
  11.         P1SEL = BIT1 + BIT2 + BIT5 + BIT6 + BIT7;                     // P1.1 = RXD, P1.2=TXD
  12.         P1SEL2 = BIT1 + BIT2 + BIT5 + BIT6 + BIT7;
  13. }
  14. void Serial_init()
  15. {
  16.         UCA0CTL1 |= UCSSEL_2;                     // SMCLK
  17.         UCA0BR0 = 0x82;                              // 16MHz 9600 UCA0BRX=1666=0x0682
  18.         UCA0BR1 = 0x06;                              // 16MHz 9600
  19.         UCA0MCTL = UCBRS2 + UCBRS1;               // Modulation UCBRSx = 6
  20.         UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  21.         IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt
  22. }
  23. void SPI_init()
  24. {
  25.         UCB0CTL1 = UCSWRST;                       // **Put state machine in reset**
  26.         UCB0CTL0 |= UCCKPL + UCMSB + UCSYNC;      // 3-pin, 8-bit SPI master
  27.         UCB0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  28.         IE2 |= UCB0RXIE;                          // Enable USCI0 RX interrupt
  29. }

  30. void Init_all()
  31. {
  32.         Clk_init();
  33.         IO_init();
  34.         Serial_init();
  35.         SPI_init();
  36. }
  37. int main(void)
  38. {
  39.         WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
  40.         //while (!(P1IN & BIT5));                   // If clock sig from mstr stays low,
  41.                                                                                         // it is not yet in SPI mode
  42.         Init_all();
  43.         __bis_SR_register(LPM4_bits + GIE);       // Enter LPM4, enable interrupts
  44. }
  45. #pragma vector=USCIAB0RX_VECTOR
  46. __interrupt void USCI0RX_ISR(void)
  47. {


  48.         temp = UCB0RXBUF;
  49.     while (!(IFG2&UCB0TXIFG));                // USCI_A0 TX buffer ready?
  50.     UCB0TXBUF = temp;                    // TX -> RXed character
  51.         while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready?
  52.         UCA0TXBUF = temp;                    // TX -> RXed character
  53. }
复制代码



最新回复

楼主解决了吗?我用MSP432,也有这个问题,我用库函数解决的,但是试了10次就一次进了接收中断,之后就进不了。我照着例程里的写的,也使能了中断的,还是不太清楚什么情况,不知道有没有大神清楚的。  详情 回复 发表于 2017-6-12 10:39
 
点赞 关注

回复
举报

222

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
主机程序

  1. #include <msp430.h>
  2. unsigned char MST_Data, SLV_Data;
  3. //主机,主动发送数据;并接收通过串口上传

  4. void Clk_init()
  5. {
  6.         BCSCTL1 = CALBC1_16MHZ;                    // Set DCO
  7.         DCOCTL = CALDCO_16MHZ;
  8. }
  9. void IO_init() //端口初始化
  10. {
  11.         P1SEL = BIT1 + BIT2 + BIT5 + BIT6 + BIT7;                     // P1.1 = RXD, P1.2=TXD
  12.         P1SEL2 = BIT1 + BIT2 + BIT5 + BIT6 + BIT7;
  13. }
  14. void Serial_init()  //串口初始化
  15. {
  16.         UCA0CTL1 |= UCSSEL_2;                     // SMCLK
  17.         UCA0BR0 = 0x82;                              // 16MHz 9600 UCA0BRX=1666=0x0682
  18.         UCA0BR1 = 0x06;                              // 16MHz 9600
  19.         UCA0MCTL = UCBRS2 + UCBRS1;               // Modulation UCBRSx = 6
  20.         UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  21.         IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt
  22. }
  23. void SPI_init()     //SPI接口初始化
  24. {
  25.         //UCB0CTL1 = UCSWRST;                       // **Put state machine in reset**
  26.         UCB0CTL0 |= UCCKPL + UCMSB + UCMST + UCSYNC;  // 3-pin, 8-bit SPI master
  27.         UCB0CTL1 |= UCSSEL_2;                     // SMCLK
  28.         UCB0BR0 |= 0x02;                          // /2
  29.         UCB0BR1 = 0;                              //
  30.         UCA0MCTL = 0;                             // No modulation  波特率调整
  31.         UCB0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  32.         IE2 |= UCB0RXIE+UCB0TXIE;                          // Enable USCI0 RX interrupt
  33. }

  34. void SPI_SendData()
  35. {
  36.         UCB0TXBUF = MST_Data;                     // Transmit first character
  37.         MST_Data++;
  38.         __delay_cycles(1000000);
  39. }

  40. void Init_all()
  41. {
  42.         Clk_init();
  43.         IO_init();
  44.         Serial_init();
  45.         SPI_init();
  46. }

  47. int main(void)
  48. {
  49.         volatile unsigned int i;
  50.         WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
  51.         Init_all();
  52.         __delay_cycles(75);                 // Wait for slave to initialize
  53.         MST_Data = 0x01;                          // Initialize data values
  54.         while(1)
  55.         {
  56.                 SPI_SendData();                                //SPI send data
  57.         }
  58. }

  59. #pragma vector=USCIAB0RX_VECTOR
  60. __interrupt void USCI0RX_ISR(void)
  61. {
  62.         while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready?
  63.         UCA0TXBUF = UCB0RXBUF;                    // TX -> RXed character
  64. }
复制代码


 
 

回复

222

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
貌似发现问题了,缺了这么一个。回实验室试一试__bis_SR_register(GIE);       // interrupts enabled
 
 
 

回复

16

帖子

0

TA的资源

一粒金砂(中级)

4
 
楼主解决了吗?我用MSP432,也有这个问题,我用库函数解决的,但是试了10次就一次进了接收中断,之后就进不了。我照着例程里的写的,也使能了中断的,还是不太清楚什么情况,不知道有没有大神清楚的。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表