主题中讨论的其他器件:MSP-EXP430FR5969
您好!
我不熟悉 MSP430技术和微控制器编程。 目前我正在处理 i2c、但我遇到了这个问题。 如果我错了、请不要太苛刻、请纠正我的错误、但 shoud 不 是_ bis_sr_register (LPM3_bits + GIE); 让程序进入 ISR? LPM0和 LPM1 (2、3、4)之间的区别是什么?
我添加了输出命令、这样我就可以在控制台中看到代码被卡住了、并且始终在 shoud 处出现残桩、而不 是_ bis_SR_register (LPM3_bits + GIE);
/*
main.c
*/
#include
#include
unsigned char SlaveAddress = 0x76;
unsigned char TXByteCtr;
unsigned char RXByteCtr;
unsigned char * PTxData;
unsigned char * PRxData;
unsigned char RXData[6];
unsigned char TXDataArr[3];
void initI2C (void);
void RXdata (unsigned char reg_addr、unsigned char RX_BYTE);
void TXdata (unsigned char TX_BYTE);
void IIC_TX (void);
void IIC_RX (void);void start_TX
(void start_TX (void);void start_TX (void)
void init_slave ();
void read_slave ();
int main (void)
{
WDTCTL = WDTPW | WDTHOLD;
// I/O init
//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;
P1SEL1 |= BIT7 | // I2C 引脚
//
initI2C ();
__bis_sr_register (GIE);
init_slave ();
read_slave ();
while (1)
{
//read_slave();
}
//////////////////////////////////////
I2C B0/////////////////////////////////////////////
#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_)
#pragma vector = USCI_B0_vector
__interrupt void USCI_B0_ISR (void)
#Elif defined (__GNU__)
void __attribute__(interrupt (USCI_B0_vector)#USCI_ISR vector (void
)(void)#USCI_ISR vector 0!
#endif
{
("输入的中断服务例程\n");
switch (__evo_in_range (UCB0IV、0x1E)){
情况0x00:中断;//向量0:无中断中断中断;
情况0x02:break;
情况0x04:
UCB0CTLW0 |= UCTXSTT;//如果 NACK,则重新发送开始
中断;//向量4:NACKIFG 中断;
情况0x06:中断;//向量6:STTIFG 中断;
情况0x08:中断;//向量8:STPIFG 中断;
情况0x0a:中断;//向量10:RXIFG3中断;
情况0x0c:中断;//向量14:TXIFG3中断;
情况0x0E:中断;//向量16:RXIFG2中断;
情况0x10:中断;//向量18:TXIFG2中断;
情况0x12:中断;//向量20:RXIFG1中断;
情况0x14:中断;//向量22:TXIFG1中断;
情况0x16://向量24:RXIFG0中断;
* PRxData++= UCB0RXBUF;//获取 RX 数据
RXByteCtr --;
if (RXByteCtr = 0){
_DELAY_CYCLES (30);
UCB0CTLW1 |= UCSWACK;
UCB0CTLW0 |= UCTXACK;
UCB0CTLW0 |= UCTXSTP;
}
否则{
UCB0IFG &=~UCRXIFG0;
_BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);
}
中断;
情况0x18:
if (TXByteCtr){//检查 TX 字节计数器
UCB0TXBUF =* PTxData++;//加载 TX 缓冲区
TXByteCtr --;
}
否则{
UCB0CTLW0 |= UCTXSTP;// I2C 停止条件
UCB0IFG &=~UCTXIFG;//清除 USCI_B0 TX 内部标志
__BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);//退出 LPM0
}
中断;//向量26:TXIFG0中断;
情况0x1A:
UCB0IFG &=~UCBCNTIFG;
中断;//向量28:BCNTIFG 中断;
情况0x1c:中断;//向量30:时钟低电平超时中断;
情况0x1E:中断;//向量32:第9位中断;
默认值:break;
}
}
void initI2C (void){
PUT ("初始化 i2c");
UCB0CTLW0 |= UCSWRST;//将 eUSCI_B 置于复位状态
UCB0CTLW0 |= UCMODE_3 | UCMST | UCSSEL_2 | UCSYNC;// I2C 模式、主模式、SMCLk //+ UCSSEL_2 | UCSYNC
UCB0CTLW1 |= UCASTP_2;//生成自动停止
//到达 UCB0TBCNT 后
UCB0BRW = 0x20;// 12
UCB0CTLW0 &=~ UCSWRST;//清除复位寄存器
UCB0IE |= UCNACKIE | UCBCNTIE;
PUT ("初始化 i2c 成功");
}
void TXdata (unsigned char TX_BYTE){
PUT ("调用 IIC_TX");
IIC_TX();
PUPS ("从 IIC_TX 返回");
PTxData =(unsigned char *)&TXDataArr;// TX 数组起始地址
printf ("PTxData =%d"、TXDataArr[0]);
TXByteCtr = TX_BYTE;//加载 TX 字节计数器
printf ("TXByteCtr =%d\n"、TX_BYTE);
PUT ("调用 start_tx");
START_TX();
}
void IIC_TX (void){
PUT ("输入的 IIC_TX \n");
printf ("从器件地址=%d \n"、SlaveAddress);
UCB0I2CSA =从地址;
PUT ("启用 TX 中断");
UCB0IE |= UCTXIE0;//启用 TX 中断
Put ("TX 中断启用\n");
放置("退出 IIC_TX\n");
}
void start_TX (void){
放置("输入的 start_tx \n");
while (UCB0CTLW0 & UCTXSTP);//确保发送了 STOP 条件
放置("已发送停止条件\n");
放置("启动 i2c TX\n");
UCB0CTLW0 |= UCTR + UCTXSTT;// I2C TX,启动条件
PUT ("满足启动条件\n");
放置("输入中断服务例程\n");
_bis_SR_register (LPM3_bits + GIE);//输入 LPM0、带中断
PUT ("退出 start_tx\n");
}
void init_slaver(){
放置("正在初始化传感器");
TXDataArr[0]= 0xF4;
TXDataArr[1]= BIT5 + BIT2 + BIT1;
TXDATA (2);
PUT ("初始化传感器成功");
}
void read_slave(){
放置("从传感器读取数据...");
RXDATA (0xFA、2);
PUT ("数据读取");
}
