📄 main.c
字号:
#include "msp430x22x4.h"
/*此程序是USCIB0的I2C模式从机程序
首先按下图连接好导线,在启动主机程序前先启动从机程序
然后再启动主机程序,从机程序将每次收到的数据以中断的方式存入0400开始的ram中
当主机发满100的数据时,在最后一位后面加入停止位,从机接收到停止位时,进入相应中断,
并在中断服务中,设置sp,来使主程序退出低功耗
/|\ /|\
MSP430x22x4 10k 10k MSP430x22x4
slave | | master
----------------- | | -----------------
-|XIN P3.1/UCB0SDA|<-|---+->|P3.1/UCB0SDA XIN|-
32kHz | | | | | 32kHz
-|XOUT | | | XOUT|-
| P3.2/UCB0SCL|<-+----->|P3.2/UCB0SCL |
| | | |
*/
__no_init char data_ptr[100] @ 0x0400;//定义接收缓存的首地址为0x0400
int main( void )
{
WDTCTL=WDTPW+WDTHOLD; //关看门狗
BCSCTL1 =CALBC1_1MHZ; //设定DCO为1MHZ
DCOCTL =CALBC1_1MHZ;
P1DIR |=BIT0; //led使能
P3SEL |=BIT1+BIT2; //p3.1为UCB0SDA,P3.2为UCB0SCL
UCB0CTL0=UCSYNC+UCMODE_3; //UCB0为I2C从机模式
UCB0I2COA=88; //设定本机从机地址位88
UCB0CTL1 &=~UCSWRST; //进入I2C工作模式
UCB0I2CIE |=UCSTPIE+UCSTTIE; //开始位和停止位中断使能
IE2 |=UCB0RXIE; //使能I2C接收中断
_BIS_SR(CPUOFF + GIE); //进入低功耗0
_NOP(); //用于调试
while(1);
return 0;
}
#pragma vector = USCIAB0TX_VECTOR //数据接收中断服务
__interrupt void i2c_rx_isr(void)
{
static char i=0;
data_ptr[i]=UCB0RXBUF; //将收到的数据存入0x0400开始的RAM中
i++;
}
#pragma vector = USCIAB0RX_VECTOR //数据开始,停止位标志中断服务
__interrupt void i2c_stt_stp(void)
{
if(UCSTPIFG&UCB0STAT)
{
_BIC_SR_IRQ(LPM0_bits); //当接收到停止位时退出低功耗
}
UCB0STAT &=~(UCSTPIFG+UCSTTIFG); //清开始,停止标志为
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -