主题中讨论的其他器件:OPT3001
工具/软件:Code Composer Studio
我附上了该代码并在标记为错误的指令上加下划线。
我试图通过 witty fox 从 opt3001模块读取值。
#include //通用 MSP430器件包括 #include #define OPT3001 0x44 #define RESULT 0x00 #define Configuration 0x01 #define ONE_BYTE 0x1 #define two_bytes 0x2 #define Three _bytes 0x3 unsigned long lux; void GPIO_PING_configurations (void); void I2C_transmission ch变速箱 设置(unsigned char num_OF_BYTES); void I2C_WRITE (unsigned char 从机 char 从机地址、unsigned char char register 1、unsigned char cyte_address1、void 、unsigned char void I2C_read (unsigned char slave_address); unsigned long convert_to_lux (unsigned int 指数、unsigned int 尾数); unsigned char TXData[3]; unsigned char RXData[2]; unsigned char ByteCtr; void main (void) { WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器 GPIO_PIN_configurations (); PM5CTL0 &=~LOCKLPM5;//禁用 GPIO 上电默认高阻抗模式 //激活先前配置的端口设置 unsigned int 指数; unsigned int 尾数; while (1) { //写入配置寄存器(0x01)以设置 OPT3001 I2C_Transmission _setup (three 字节)的操作模式; I2C_WRITE (OPT3001、配置、0xC2、0x10); //延迟100毫秒以允许转换过程完成 __delay_cycles (100); I2C_transmission 设置(two_bytes); I2C_setup_write (OPT3001、Result); I2C_transmission 设置(One_byte); I2C_Read (OPT3001); //从原始结果值 指数中提取指数的高四位和尾数的低12位= RXData[0]>> 4; 尾数=(RXData[0]<< 8 | RXData[1])& 0x0FFF; //take the Exponent and 尾数值并计算相应的 lux 值 lux = convert_TO_lux (指数、尾数); }//结束背景循环 }// end main () #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_) #pragma vector = USCI_BUSCI_0_ void (void)#interrupt USCI_isr (n_b0_isr)(n_isr)(nvoid _isr)#interrupt (n_isr) #endif { switch (__even_in_range (UCB0IV、USCI_I2C_UCBIT9IFG)) { case USCI_none:break;//向量0:no interrupts break; case USCI_I2C_UCALIFG:break; case USCI_I2C_UCCIFG: UCB0CTL1_中断; case USCI_CCIFG:USCI_中断/ UCCIFG;case 4:中断/中断/中断 //向量10:RXIFG3中断; 实例 USCI_I2C_UCTXIFG3:中断;//向量14:TXIFG3中断; 实例 USCI_I2C_UCRXIFG2:中断;//向量16:RXIFG2中断; 实例 USCI_I2C_UCTXIFG2:中断;//向 量18:TXIFG2中断;USCI_USCI_UCRXIFG 24:USCI_USCI_USCI_USCI_UCR_BRECOK;实例 USCI_USCI_USCI_USCI_USCI_USCI_USCI_USCI_USCI_USCI_USCI_USCI 中断;USCI_USCI_USCI_USCI_USCI_USCI_US RXIFG0 break; RXData[ByteCTR]= UCB0RXBUF;//加载 RX 缓冲 区 ByteCTR++;//递增 RX 字节计数 器 break; case USCI_I2C_UCTXIFG0://向量26:TXIFG0 break; UCB0TXBUF = TXData[ByteCTR];// Increment USCI_CCUSCI_TXC0 b_R+ ;// InCLUSCI_CLUSCI_CLUST_TXC0:// Increment UST_CLUST_CLUST_CLUST_CLUST_CLUST_CLUST_CLUST_CLUST_CLUST_CLUST_CLUST_CLUST_CLUST_CLUST_CLUST_RISTER;// Increment/ BOUT0:// Increment_CK_ 中断;//矢量30:时钟低电平超时 情况 USCI_I2C_UCBIT9IFG:中断;//矢量32:第九位 默认值:中断; } }void I2C_translation_setup (unsigned char num_for_bytes) { //为 I2C 模式配置 USCI_B0并指定要发送/接收 的字节数 UCB0CTLW0 |= UCSWRST; //软件复位使能 UCB0CTLW0 |= UCMODE_3 | UCMST | UCSYNC|UCSSEL_3;// I2C 主模式、SMCLK UCB0CTLW1 |= UCAST_2;//自动停止生成 //到达 UCB0TBCNT 后 UCB0BRW = 0x8;// UCB0TBCLK = UCB0CTL1字节/ UCB0CTL = UCB0B0字节;//接收~到 UCB0TBCL1 //清除复位寄存 器 UCB0IE |= UCTXIE0 | UCRXIE0 | UCNACKIE | UCBCNTIE;//发送和 NACK 中断使能 } void I2C_WRITE (unsigned char slave_address、unsigned char register_address、unsigned char byte_1、unsigned char byte_2) { UCB0I2CSA = slave_address ;// TXData register = slave_address;//设置数据地址 //设置控制寄存器地址 TXData[1]= byte_1;//设置寄存器数据 LSB TXData[2]= byte_2;//设置寄存器数据 MSB ByteCtr = 0;//加载字节计数 器 while (UCB0CTLW0 & UCTXSTP);//确保发送停止条件 UCB0CTLW0 | UCB0CTLW0 | UCBCTLW0 | UCB0CTLWT= UCTLW0;//确保发送停止条件 // I2C 起始条件 __bis_SR_register (LPM0_Bits | GIE);//输入 LPM0带中断 //保持在 LPM0中直到所有数据 //为 TX } void I2C_setup_write (unsigned char slave_address、unsigned char register_address) { UCB0I2CSA = slave_address;//设置从 器地址= TX0_address;//设置从器件地址= TX0_address]; //设置控制寄存器地址 ByteCtr = 0;//加载字节计数 器 while (UCB0CTLW0 & UCTXSTP);//确保发送停止条件 UCB0CTLW0 |= UCTR;// I2C TX UCB0CTLW0 |= UCTXSTT;// I2C 开始条件 _ bis_SR_register (LPMG0 | BITS);// I2C //输入带中断的 LPM0 //保持在 LPM0中直到所有数据 //已发送 } void I2C_read (unsigned char slave_address) { UCB0I2CSA = slave_address;//设置从器件地址 ByteCtr = 0;//加载字节计数 器 while (UCB0CTLW0 & UCTXSTP);//确保发送 UCB0CTLW0 ~停止条件;//确保发送 UCB0CTLW0 // I2C RX UCB0CTLW0 |= UCTXSTT;// I2C 开始条件 __bis_SR_register (LPM0_Bits | GIE); //输入带中断的 LPM0 //保持在 LPM0中直到所有数据 //为 RX } unsigned long convert_to-lux (unsigned int 指数、unsigned int 尾数) { //根据以下公式将结果寄存器转换为 lux 测量: // lux = 0.01 *(2^E[3:0])* R[11:0] ;unsigned int 结果 unsigned int count; unsigned long conved_lux; result = 1; for (count =指数; count > 0;count--) { result = result * 2; } conved_lux =尾数/ 100; converted_lux *= result; return conved_lux; } void GPIO_pin_configurations (void) { //设置 P1.2和 P1.3引脚以实现 I2C 功能 P4SEL0 || BIT6 | BIT7; }
编辑:这是带下划线的代码行。
_bis_SR_register (LPM0_bits | GIE);//输入 LPM0、带中断