MSP430G2553软件实现IIC

时间:2025-03-15 08:34:17
#define uchar unsigned char #define uint unsigned int //=====================================延时函数================================= #define CPU_F ((double)8000000) #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) //=====================================IIC地址设置================================= #define WHO_AM_I 0x75 //IIC地址寄存器(默认数值0x68,只读)--(6050) #define SlaveAddress 0x80 //IIC写入时的地址字节数据,+1为读取--(PCA9685) //=====================================IIC端口定义================================= #define SCL1 P1OUT|=BIT4 #define SCL0 P1OUT&= ~BIT4 #define SDA1 P1OUT|=BIT5 //IIC数据引脚 #define SDA0 P1OUT&= ~BIT5 #define SDAIN P1DIR&= ~BIT5 #define SDAOUT P1DIR|=BIT5 #define SDADATA (P1IN&BIT5) //================================I2C起始信号================================ void I2C_Start() { SDA1; //拉高数据线 SCL1; //拉高时钟线 delay_us(5); //延时 SDA0; //产生下降沿 delay_us(5); SCL0; //拉低时钟线 } //================================I2C停止信号================================ void I2C_Stop() { SDA0; //拉高数据线 SCL1; delay_us(5); SDA1; //产生上升沿 delay_us(5); } //================================I2C发送应答信号 入口参数:ack (0:ACK 1:NAK)================================ void I2C_SendACK(uchar ack) { SDAOUT; if(ack) SDA1; else SDA0; //SDA=ack; //读应答信号 SCL1; delay_us(5); SCL0; //拉低时钟线 delay_us(5); } //================================I2C接收应答信号================================ uchar I2C_RecvACK() { uchar cy; SCL1; SDAIN; delay_us(5); if(SDADATA) { cy=1; } else { cy=0; } //cy=SDA; //读应答信号 SCL0; delay_us(5); SDAOUT; return cy; } //================================向I2C总线发送一个字节数据================================ void I2C_SendByte(uchar dat) { uchar i; for(i=0;i<8;i++) //8位计数器 { if((dat<<i)&0x80) { SDA1; } else { SDA0; } //SDA=cy; //送数据口 SCL1; delay_us(5); SCL0; delay_us(5); } I2C_RecvACK(); } //================================从I2C总线接收一个字节数据================================ uchar I2C_RecvByte() { uchar i; uchar dat=0,cy; SDA1; //使能内部上拉,准备读取数据, SDAIN; //8位计数器 for(i=0;i<8;i++) { dat<<=1; SCL1; delay_us(5); if(SDADATA) { cy=1; } else { cy=0; } dat|=cy; //读数据 SCL0; delay_us(5); } SDAOUT; return dat; } //=======================向I2C设备写入一个字节数据====================================== void Single_WriteI2C(uchar REG_Address,uchar REG_data) { I2C_Start(); //起始信号 I2C_SendByte(SlaveAddress); //发送设备地址+写信号 I2C_SendByte(REG_Address); //内部寄存器地址 I2C_SendByte(REG_data); //内部寄存器数据 I2C_Stop(); //发送停止信号 } //======================从I2C设备读取一个字节数据===================================== uchar Single_ReadI2C(uchar REG_Address) { uchar REG_data; I2C_Start(); //起始信号 I2C_SendByte(SlaveAddress); //发送设备地址+写信号 I2C_SendByte(REG_Address); //发送存储单元地址,从0开始 I2C_Start(); //起始信号 I2C_SendByte(SlaveAddress+1); //发送设备地址+读信号 REG_data=I2C_RecvByte(); //读出寄存器数据 I2C_SendACK(1); //接收应答信号 I2C_Stop(); //停止信号 return REG_data; } //======================================合成数据====================================== int GetData(uchar REG_Address) { char H,L; H=Single_ReadI2C(REG_Address); L=Single_ReadI2C(REG_Address+1); return (H<<8)+L; //合成数据 }