主题中讨论的其他部件:MSP-EXP430FR2433, MSP430F5329
//=============================================================================================================
#include "MSP4S.h"
#include "driverlib.h"
#define DCOFREQ 800万
#define I2C_0_BBASE (EUSI_B0_Bbase)
#define I2C_RECEIVE_BUFFER_SIZE (32)
uint8_t I2C_0_rxBuffer[I2C_RECEIVE_BUFFER_SIZE];
INT8_T_0_rxBytesaining_0 = I2C_0
EUSCI_B_I2C_initMasterParam I2C_0;
// SMCLK = MCLK = DCO = 4MHz
// ACL = 32kHz
Cs_initClockSignal (CS_FLLREF,CS_REFOLCLK_SELECT,CS_CLock_diver_1);
cs_initClockSignal (CS_ACLK,CS_REFOLCLK_SELECT,CS_CLock_diver_1);
cs_initClockSignal (CS_MCLK,CS_DCOCLKDIV_SELECT,CS_CLock_DICROLATER_1);
cs_initClockSignal (CS_SMCLK,CS_DCOCLKDIV_SELECT,CS_CLock_diver_1);
cs_initFLL(DCOFREQ/1000),DCOFREQ/3.2768万);
cs_clearAllOscar FlagsWithTimeout (1000);
// I2C端口多路复选
P1OUT = 0;
P1DIR || BIT0 | BIT1 | BIT4 | BIT5 | BIT6;
P1SEL0 || BIT2 | BIT3;
PM5CTL0 &=~LOCKLPM2;
// I2C设置
I2C_0.selectClockSource = EUSCI_B_I2C_CLOCKSOURCE_SMCLK;
I2C_0.i2cClk = DCOFREQ;
I2C_0.datarate = EUSCI_B_I2C_SET_DATA_RATE_400KBPS;
I2C_0.byteCounterThreshold = 0;
I2C_0.autoSTOPGeneration = EUSCI_B_I2C_NO_AUTO_STOP;
EUSCI_B_I2C_DISABLE (I2C_0_BASE);
EUSCI_B_I2C_initMaster (I2C_0_BASE,&I2C_0);
EUSCI_B_I2C_ENABLE (I2C_0_BASE);
__delay_cycles(800万);
}
uint8_t I2C_0_readCmd (uint8_t slaver, uint8_t cmd)
{
P1OUT || BIT0 | BIT4 | BIT5 | BIT6;
//设置从属地址并等待总线
EUSCI_B_I2C_setSlaveAddress (I2C_0_BASE,从机);
EUSCI_B_I2C_clearInterrupt (I2C_0_BASE,
EUSCI_B_I2C_receive _INTERRUPT0 |\
EUSCI_B_I2C_Transmit_INTERRUPT0 |\
EUSCI_B_I2C_STOP_INTERRUPT);
EUSCI_B_I2C_enableInterrupt (I2C_0_BASE,
EUSCI_B_I2C_receive _INTERRUPT0 |\
EUSCI_B_I2C_STOP_INTERRUPT);
I2C_0_rxBytesRemaining = 0;
//写入命令到从属设备
EUSCI_B_I2C_setMode (I2C_0_BASE,EUSCI_B_I2C_Transmit_mode);
EUSCI_B_I2C_masterSendMultiByteStart(I2C_0_Base,cmd);
while (!(EUSCI_B_I2C_getInterruptStatus (I2C_0_BASE,EUSCI_B_I2C_Transmit_INTERRUPT0)))
{
IF (EUSCI_B_I2C_getInterruptStatus (I2C_0_BASE,EUSCI_B_I2C_NAK_INTERRUPT))
{
返回0;}
}
//从从属设备读取响应
EUSCI_B_I2C_masterReceiveStart (I2C_0_BASE);
同时(EUSCI_B_I2C_isBusy (I2C_0_BASE));
EUSCI_B_I2C_DisableInterrupt (I2C_0_BASE,
EUSCI_B_I2C_receive _INTERRUPT0 |\
EUSCI_B_I2C_STOP_INTERRUPT);
P1OUT &=~BIT0;
返回I2C_0_rxCnt;
}
void run (void)
{
I2C_0_readCmd (0x0B,0x02);
__no_operation();
__delay_cycles(100万);
}
void main(void)
{
WDTCTL = WDTPW | WDTHOLD;
__enable_interrupit();
Setup();
同时(1)
{
run();
}
}
#pragma vector=USI_B0_vector
__interrupt void I2C_0_ISR(void)
{
UINT8_t数据;
P1OUT || BIT1;
Switch(__偶 数_in_range(UCB0IV,0x1E))
{
0x00:中断; //向量0:无中断中断;
案例0x02:中断; //矢量2:ALIFG中断;
0x04:中断; //矢量4:NACKIFG中断;
判例0x06:中断; //矢量6:STT IFG中断;
案例0x08:
P1OUT &=~BIT5;
中断; //矢量8:STPIFG中断;
0x0a:中断; //矢量10:RXIFG3中断;
0x0c:中断; //矢量14:TXIFG3中断;
0x0E:中断; //矢量16:RXIFG2中断;
0x10:中断; //矢量18:TXIFG2中断;
0x12:中断; //矢量20:RXIFG1中断;
0x14:中断; //矢量22:TXIFG1中断;
案例0x16: //矢量24:RXIFG0中断;
//接收字节
数据= EUSCI_B_I2C_masterReceiveMultiByteNext(I2C_0_BASE;
//如果这是第一个字节(RX长度无效),则保存要读取的长度
//并将接收计数器重置为0
IF (I2C_0_rxBytesRemaining == 0x00)
{
I2C_0_rxBytesRemaining =数据;
IF (I2C_0_rxBytesRemaining > I2C_Receive_buffer_size)
{
I2C_0_rxBytesRemaining = I2C_Receive_buffer_size
;}
I2C_0_rxCnt = 0;
}
//如果这不是第一个字节,则将响应附加到RX
//缓冲区
否则
{
I2C_0_rxBuffer[I2C_0_rxCnt++]=数据;
I2C_0_rxBytesRemaining--;
}
//在最后一个字节进入时发送nack和stop
IF (I2C_0_rxBytesRemaining == 1)
{
P1OUT &=~BIT4;
EUSCI_B_I2C_masterReceiveMultiByteStop(I2C_0_BASE);
}
中断;
0x18:中断; //矢量26:TXIFG0中断;
0x1a:中断; //矢量28:BCNTIFG中断;
0x1c:中断; //矢量30:时钟低超时中断;
案例0x1E:中断; //矢量32:第9位中断;
默认值:break;
}
P1OUT &=~BIT1;
}
我从Walter那里得到了这个代码,它位于“MSP430F5329: How do you send a NAK in I2C SMBus Protocol”(MSP430F5329:如何在I2C SMBus协议中发送NAK)
帖子。
我以为我理解了它并用它来编写我的代码。 我的代码中没有得到任何SDA或SCL引脚移动。 所以我决定从Walter的"工作代码"开始,慢慢迁移到我的应用程序。
在主要程序中
void main (void) { WDTCTL = WDTPW | WDTHOLD; __enable_interrupit(); Setup(); 同时(1) { run(); } }
我不编译任何警告或错误。
当我单步进入setup();时,它似乎在__enable_Interrupt()之后失控。
拆卸看起来像是对#setup的有效调用
但它跳至00C400 __program_start
为什么要这样做?
这是看门狗计时器吗? 或者其他中断未处理?
我很困惑。 我正在将MSP-EXP430FR2433与IAR编译器配合使用。
谢谢!
基普

