/* ********************************************************************************************************* * 函 数 名: SI4730_SendCmd * 功能说明: 向Si4730发送CMD * 形 参: _pCmdBuf : 命令数组 * _CmdLen : 命令串字节数 * 返 回 值: 0 失败(器件无应答), 1 成功 ********************************************************************************************************* */ uint8_t SI4730_SendCmd(uint8_t *_pCmdBuf, uint8_t _ucCmdLen) { uint8_t ack; uint8_t i; i2c_Start(); i2c_SendByte(I2C_ADDR_SI4730_W); ack = i2c_WaitAck(); if (ack != 0) { goto err; } for (i = 0; i < _ucCmdLen; i++) { i2c_SendByte(_pCmdBuf[i]); ack = i2c_WaitAck(); if (ack != 0) { goto err; } } i2c_Stop(); return 1; err: i2c_Stop(); return 0; }
/* ********************************************************************************************************* * 函 数 名: SI4730_PowerUp_FM_Revice * 功能说明: 配置Si4703为FM接收模式, 模拟模式(非数字模式) * 形 参:无 * 返 回 值: 0 失败, 1 成功 ********************************************************************************************************* */ uint8_t SI4730_PowerUp_FM_Revice(void) { uint8_t ack; uint8_t status; /* AN332 page = 277 Powerup in Analog Mode CMD 0x01 POWER_UP ARG1 0xC0 Set to FM Receive. Enable interrupts. ARG2 0x05 Set to Analog Audio Output STATUS →0x80 Reply Status. Clear-to-send high. */ i2c_Start(); i2c_SendByte(I2C_ADDR_SI4730_W); ack = i2c_WaitAck(); i2c_SendByte(0x01); ack = i2c_WaitAck(); i2c_SendByte(0xC0); ack = i2c_WaitAck(); i2c_SendByte(0x05); ack = i2c_WaitAck(); i2c_Stop(); /* 等待器件返回状态 0x80 */ { uint32_t i; for (i = 0; i < 2500; i++) { i2c_Start(); i2c_SendByte(I2C_ADDR_SI4730_R); /* 读 */ ack = i2c_WaitAck(); status = i2c_ReadByte(); i2c_NAck(); i2c_Stop(); if (status == 0x80) { break; } } /* 实测 535 次循环应该正常退出 */ if (i == 2500) { return 0; } } return 1; }
//----------------------------------------------- long _24c01_read_4byte(short adr) { long temp; //char temp1; long temp_[4]; i2c_Start(); i2c_SendByte(0xa0); if(i2c_ReadAcknowledge()) goto Stop_label_24c01_read_4byte; i2c_SendByte((char)adr); if(i2c_ReadAcknowledge()) goto Stop_label_24c01_read_4byte; i2c_Restart(); i2c_SendByte(0xa1); if(i2c_ReadAcknowledge()) goto Stop_label_24c01_read_4byte; temp_[0]=i2c_ReadByte(); i2c_SendAcknowledge(1); temp_[1]=i2c_ReadByte(); i2c_SendAcknowledge(1); temp_[2]=i2c_ReadByte(); i2c_SendAcknowledge(1); temp_[3]=i2c_ReadByte(); i2c_SendAcknowledge(0); Stop_label_24c01_read_4byte: i2c_Stop(); temp_[0]&=0x000000ff; temp_[1]<<=8; temp_[1]&=0x0000ff00; temp_[2]<<=16; temp_[2]&=0x00ff0000; temp_[3]<<=24; temp_[3]&=0xff000000; temp=temp_[0]+temp_[1]+temp_[2]+temp_[3]; return temp; }
unsigned int mem_Write(unsigned int addr,unsigned char *data, unsigned int data_len) { unsigned int i=0; unsigned char b; i2c_Start(); i2c_Write(MEM_ADDRESS); if (i2c_Timeout()) goto Timeout; b = addr>>8; i2c_Write(b); if (i2c_Timeout()) goto Timeout; b = addr&0xFF; i2c_Write(b); if (i2c_Timeout()) goto Timeout; for (i=0; i<data_len; i++) { i2c_Write(data[i]); if (i2c_Timeout()) goto Timeout; } i2c_Stop(); return i; Timeout: return i; }
/* ********************************************************************************************************* * 函 数 名: i2c_CfgGpio * 功能说明: 配置I2C总线的GPIO,采用模拟IO的方式实现 * 形 参:无 * 返 回 值: 无 ********************************************************************************************************* */ static void i2c_Cfg(void) { GPIO_Init(GPIOB, GPIO_PIN_4|GPIO_PIN_5, GPIO_MODE_OUT_OD_HIZ_FAST); /* 给一个停止信号, 复位I2C总线上的所有设备到待机模式 */ i2c_Stop(); }
/*! * @brief 读取I2C设备指定地址寄存器的数据 * @param I2Cn_e I2C模块(I2C0、I2C1) * @param SlaveID 从机地址(7位地址) * @param reg 从机寄存器地址 * @return 读取的寄存器值 * @since v5.0 * Sample usage: uint8 value = i2c_read_reg(I2C0, 0x1D, 1); */ uint8 i2c_read_reg(I2Cn_e i2cn, uint8 SlaveID, uint8 reg) { //先写入寄存器地址,再读取数据,因此此过程是 I2C 的复合格式,改变数据方向时需要重新启动 uint8 result; ASSERT((SlaveID & 0x80) == 0); //断言,我们要求的7位地址的值仅仅是7bit,不是通信时要求的高7位 //有些手册,给出的7位地址指的是8bit里的高7位 //有些手册,给出的7位地址指的是7bit //请自行确认,可以尝试是否通信正常来确认 i2c_Start(i2cn); //发送启动信号 i2c_write_byte(i2cn, ( SlaveID << 1 ) | MWSR); //发送从机地址和写位 i2c_write_byte(i2cn, reg); //发送从机里的寄存器地址 i2c_RepeatedStart(i2cn); //复合格式,发送重新启动信号 i2c_write_byte(i2cn, ( SlaveID << 1) | MRSW ); //发送从机地址和读位 i2c_PutinRxMode(i2cn); //进入接收模式(不应答,只接收一个字节) result = I2C_D_REG(I2CN[i2cn]); //虚假读取一次,启动接收数据 i2c_Wait(i2cn); //等待接收完成 i2c_Stop(i2cn); //发送停止信号 result = I2C_D_REG(I2CN[i2cn]); //读取数据 Pause(); //必须延时一下,否则出错 return result; }
/* ********************************************************************************************************* * 函 数 名: SI4730_GetRevision * 功能说明: 读取器件、固件信息。 返回8字节数据 * 形 参:_ReadBuf 返回结果存放在此缓冲区,请保证缓冲区大小大于等于8 * 返 回 值: 0 失败, 1 成功 ********************************************************************************************************* */ uint8_t SI4730_GetRevision(uint8_t *_ReadBuf) { uint8_t ucCmdBuf[2]; uint32_t uiTimeOut; uint8_t i; /* AN223 page = 67 */ /* 发送 0x10 命令 */ ucCmdBuf[0] = 0x10; SI4730_SendCmd(ucCmdBuf, 1); /* 第1个形参表示最大轮询次数; 如果成功,返回值uiTimeOut > 0 表示实际轮询次数 第2个形参0表示结束后不发送STOP, 因为还需要读取器件返回数据 */ uiTimeOut = SI4730_WaitStatus80(10, 0); if (uiTimeOut == 0) { return 0; } /* 连续读取8个字节的器件返回信息 */ for (i = 0; i < 8; i++) { i2c_Ack(); _ReadBuf[i] = i2c_ReadByte(); } i2c_NAck(); i2c_Stop(); return 1; }
void i2cBurstReadBytes(BYTE ucSlaveAdr, BYTE ucSubAdr, BYTE *pBuf, BYTE ucBufLen) { BYTE ucDummy; // loop dummy BYTE tmp; ucDummy = I2C_ACCESS_DUMMY_TIME; while(ucDummy--) { if (i2c_AccessStart(ucSlaveAdr, I2C_WRITE) == FALSE) continue; if (i2c_SendByte(ucSubAdr) == I2C_NON_ACKNOWLEDGE) // check non-acknowledge continue; if (i2c_AccessStart(ucSlaveAdr, I2C_READ) == FALSE) continue; while(ucBufLen--) // loop to burst read { tmp= i2c_ReceiveByte(ucBufLen); // receive byte *pBuf = tmp; pBuf++; // next byte pointer } // while break; } // while i2c_Stop(); }
/*! * Read a register from the MMA7660 * @param u8RegisterAddress is Register Address * @return Data stored in Register */ unsigned char u8MMA7660ReadRegister(unsigned char u8RegisterAddress) { unsigned char result; /* Send Slave Address */ IIC_StartTransmission(SlaveID,MWSR); i2c_Wait(); /* Write Register Address */ I2C1_D = u8RegisterAddress; i2c_Wait(); /* Do a repeated start */ I2C1_C1 |= I2C_C1_RSTA_MASK; /* Send Slave Address */ I2C1_D = (MMA7660_I2C_ADDRESS << 1) | 0x01; //read address i2c_Wait(); /* Put in Rx Mode */ I2C1_C1 &= (~I2C_C1_TX_MASK); /* Turn off ACK */ I2C1_C1 |= I2C_C1_TXAK_MASK; /* Dummy read */ result = I2C1_D ; i2c_Wait(); /* Send stop */ i2c_Stop(); result = I2C1_D ; return result; }
uint8_t my_i2c_read_nbytes(I2Cn_e i2cn, uint8_t addr, uint8_t reg, int length, uint8_t * pdata) { int i = 0; uint8_t dump; i2c_Start(i2cn); if(!my_i2c_write_byte(i2cn, ( addr << 1 ) | MWSR)) { return 0; } if(!my_i2c_write_byte(i2cn, reg)) { return 0; } i2c_RepeatedStart(i2cn); if(!my_i2c_write_byte(i2cn, ( addr << 1 ) | MRSW)) { return 0; } i2c_EnterRxMode(i2cn); dump = I2C_D_REG(I2C0_BASE_PTR); if(!my_i2c_Wait(i2cn)) { return 0; } for(i = 0; i < length; i++) { if(i == length - 1) { i2c_PutinRxMode(i2cn); *(pdata + i) = I2C_D_REG(I2C0_BASE_PTR); } else { *(pdata + i) = I2C_D_REG(I2C0_BASE_PTR); } if(!my_i2c_Wait(i2cn)) { return 0; } } i2c_Stop(i2cn); return 1; }
////////////////////////////////////////////////////////////////////////// // I2C access start. // // Arguments: ucSlaveAdr - slave address // trans_t - I2C_TRANS_WRITE/I2C_TRANS_READ ////////////////////////////////////////////////////////////////////////// BOOL i2c_AccessStart(BYTE ucSlaveAdr, I2C_Direction trans_t) { BYTE ucDummy; // loop dummy if (trans_t == I2C_READ) // check i2c read or write ucSlaveAdr = I2C_DEVICE_ADR_READ(ucSlaveAdr); // read else ucSlaveAdr = I2C_DEVICE_ADR_WRITE(ucSlaveAdr); // write ucDummy = I2C_ACCESS_DUMMY_TIME; while (ucDummy--) { i2c_Delay(); if (i2c_Start() == FALSE) continue; if (i2c_SendByte(ucSlaveAdr) == I2C_ACKNOWLEDGE) // check acknowledge return TRUE; //printf("ucSlaveAdr====%x", ucSlaveAdr); i2c_Stop(); Delay1ms(1); } return FALSE; }
/*FUNCTION*------------------------------------------------------------------- * * Function Name : max3353_WriteReg * Returned Value : * Comments : Write data to max3353 register * * *END*----------------------------------------------------------------------*/ bool max3353_WriteReg ( uint8_t i2c_channel, uint8_t regAdd , uint8_t regValue ) { /* Send I2C slave address to bus*/ i2c_Start(i2c_channel); i2c_WriteByte(i2c_channel,(MAX3353_SLAVE_ADDR <<1) | 0); i2c_Wait(i2c_channel); /* Send register address of MAX3353 */ i2c_WriteByte(i2c_channel, regAdd); i2c_Wait(i2c_channel); /* Send data to MAX3353*/ i2c_WriteByte(i2c_channel, regValue); i2c_Wait(i2c_channel); /* Send stop signal */ i2c_Stop(i2c_channel); Pause(); return TRUE; }
void i2c_slave_command(uint8_t slave_address, uint8_t address, uint8_t command) { i2c_Start(); // send Start i2c_Address(slave_address, I2C_WRITE); // Send slave address with write operation i2c_Write(address); // Servo Speed i2c_Write(command); // 2 seconds on servo 0 i2c_Stop(); // send Stop }
/* ********************************************************************************************************* * 函 数 名: SI4730_WaitStatus80 * 功能说明: 读取Si4730的状态,等于0x80时返回。 * 形 参: _uiTimeOut : 轮询次数 * _ucStopEn : 状态0x80检测成功后,是否发送STOP * 返 回 值: 0 失败(器件无应答), > 1 成功, 数字表示实际轮询次数 ********************************************************************************************************* */ uint32_t SI4730_WaitStatus80(uint32_t _uiTimeOut, uint8_t _ucStopEn) { uint8_t ack; uint8_t status; uint32_t i; /* 等待器件状态为 0x80 */ for (i = 0; i < _uiTimeOut; i++) { i2c_Start(); i2c_SendByte(I2C_ADDR_SI4730_R); /* 读 */ ack = i2c_WaitAck(); if (ack == 1) { i2c_NAck(); i2c_Stop(); return 0; /* 器件无应答,失败 */ } status = i2c_ReadByte(); if ((status == 0x80) || (status == 0x81)) /* 0x81 是为了执行0x23指令 读取信号质量 */ { break; } } if (i == _uiTimeOut) { i2c_NAck(); i2c_Stop(); return 0; /* 超时了,失败 */ } /* 成功了, 处理一下第1次就成功的情况 */ if (i == 0) { i = 1; } /* 因为有些命令还需要读取返回值,因此此处根据形参决定是否发送STOP */ if (_ucStopEn == 1) { i2c_NAck(); i2c_Stop(); } return i; }
/* ********************************************************************************************************* * 函 数 名: SI4730_GetRevision * 功能说明: 读取器件、固件信息。 返回8字节数据 * 形 参:_ReadBuf 返回结果存放在此缓冲区,请保证缓冲区大小大于等于8 * 返 回 值: 0 失败, 1 成功 ********************************************************************************************************* */ uint8_t SI4730_GetRevision(uint8_t *_ReadBuf) { uint8_t ack; uint8_t status; uint32_t i; /* AN223 page = 67 */ /* 发送 0x10 命令 */ i2c_Start(); i2c_SendByte(I2C_ADDR_SI4730_W); ack = i2c_WaitAck(); i2c_SendByte(0x10); ack = i2c_WaitAck(); i2c_Stop(); /* 等待器件状态为 0x80 */ for (i = 0; i < 50; i++) { i2c_Start(); i2c_SendByte(I2C_ADDR_SI4730_R); /* 读 */ ack = i2c_WaitAck(); status = i2c_ReadByte(); if (status == 0x80) { break; } } /* 实测 2 次循环应该正常退出 */ if (i == 50) { i2c_NAck(); i2c_Stop(); return 0; } /* 连续读取8个字节的器件返回信息 */ for (i = 0; i < 8; i++) { i2c_Ack(); _ReadBuf[i] = i2c_ReadByte(); } i2c_NAck(); i2c_Stop(); return 1; }
/*! * Read first three registers from the MMA7660 * @param u8RegisterAddress is Register Address * @return Data stored in Register */ unsigned long u8MMA7660ReadThreeRegisters(unsigned char u8RegisterAddress) { unsigned char result1 = 0, result2 = 0, result3 = 0; /* Send Slave Address */ IIC_StartTransmission(SlaveID,MWSR); i2c_Wait(); /* Write Register Address */ I2C0_D = u8RegisterAddress; i2c_Wait(); /* Do a repeated start */ I2C0_C1 |= I2C_C1_RSTA_MASK; /* Send Slave Address */ I2C0_D = (MMA7660_I2C_ADDRESS << 1) | 0x01; //read address i2c_Wait(); /* Put in Rx Mode */ I2C0_C1 &= (~I2C_C1_TX_MASK); /* Ensure TXAK bit is 0 */ I2C0_C1 &= ~I2C_C1_TXAK_MASK; /* Dummy read */ result1 = I2C0_D ; i2c_Wait(); /* Read first byte */ result1 = I2C0_D; i2c_Wait(); /* Turn off ACK since this is second to last read*/ I2C0_C1 |= I2C_C1_TXAK_MASK; /* Read second byte */ result2 = I2C0_D; i2c_Wait(); /* Send stop */ i2c_Stop(); /* Read third byte */ result3 = I2C0_D; unsigned long totalresult = result1; totalresult <<= 8; totalresult |= result2; totalresult <<= 8; totalresult |= result3; // Provide a gap between this read and the next time_delay_ms(250); return totalresult; }
/******************************************************************************* * 名 称: Bsp_InitI2C * 功 能: 配置I2C总线的GPIO,采用模拟IO的方式实现 * 入口参数: 无 * 出口参数: 无 * 作 者: Roger-WY * 创建日期: 2016-05-20 * 修 改: * 修改日期: * 备 注: *******************************************************************************/ void Bsp_InitI2C(void) { /* 初始化I2C的两个引脚 均设置为开漏输出 */ GPIO_Init(I2C_SCL_PORT,(GPIO_Pin_TypeDef)I2C_SCL_PIN,GPIO_MODE_OUT_OD_LOW_FAST); GPIO_Init(I2C_SDA_PORT,(GPIO_Pin_TypeDef)I2C_SDA_PIN,GPIO_MODE_OUT_OD_LOW_FAST); /* 给一个停止信号, 复位I2C总线上的所有设备到待机模式 */ i2c_Stop(); }
uint8_t i2c_Write(uint8_t anbt_dev_addr, uint8_t anbt_reg_addr, uint8_t anbt_i2c_len, uint8_t *anbt_i2c_data_buf) { uint8_t i; i2c_Start(); i2c_SendByte(anbt_dev_addr << 1 | I2C_Direction_Transmitter); //发送陀螺仪写地址 i2c_SendByte(anbt_reg_addr); //发送陀螺仪PWM地址 for (i=0;i<anbt_i2c_len;i++) i2c_SendByte(anbt_i2c_data_buf[i]); //发送陀螺仪PWM值 i2c_Stop(); return 0x00; }
/*! * Read first three registers from the MMA7660 * @param u8RegisterAddress is Register Address * @return Data stored in Register */ unsigned char I2CReadMultiRegisters(unsigned char u8RegisterAddress, unsigned char bytes) { unsigned char n=bytes; int i; /* Send Slave Address */ IIC_StartTransmission(SlaveID,MWSR); i2c_Wait(); /* Write Register Address */ I2C0_D = u8RegisterAddress; i2c_Wait(); /* Do a repeated start */ I2C0_C1 |= I2C_C1_RSTA_MASK; /* Send Slave Address */ I2C0_D = (ACCEL_I2C_ADDRESS << 1) | 0x01; //read address i2c_Wait(); /* Put in Rx Mode */ I2C0_C1 &= (~I2C_C1_TX_MASK); /* Ensure TXAK bit is 0 */ I2C0_C1 &= ~I2C_C1_TXAK_MASK; /* Dummy read */ result[0] = I2C0_D ; i2c_Wait(); for(i=0;i<n-2;i++) { /* Read first byte */ result[i] = I2C0_D; i2c_Wait(); } /* Turn off ACK since this is second to last read*/ I2C0_C1 |= I2C_C1_TXAK_MASK; /* Read second byte */ result[i++] = I2C0_D; i2c_Wait(); /* Send stop */ i2c_Stop(); /* Read third byte */ result[i++] = I2C0_D; // printf("%3d %3d %3d\n",result[0],result[2],result[4]); return result[0]; }
/* ********************************************************************************************************* * 函 数 名: ee_CheckOk * 功能说明: 判断串行EERPOM是否正常 * 形 参:无 * 返 回 值: 1 表示正常, 0 表示不正常 ********************************************************************************************************* */ uint8_t ee_CheckOk(void) { if (i2c_CheckDevice(EE_DEV_ADDR) == 0) { return 1; } else { /* 失败后,切记发送I2C总线停止信号 */ i2c_Stop(); return 0; } }
//----------------------------------------------- void _24c01_write_2byte(short adr,short data) { i2c_Start(); i2c_SendByte(0xa0); if(i2c_ReadAcknowledge()) goto Stop_label_24c01_write_2byte; i2c_SendByte((char)adr); if(i2c_ReadAcknowledge()) goto Stop_label_24c01_write_2byte; i2c_SendByte(data); i2c_ReadAcknowledge(); i2c_SendByte(data>>8); i2c_ReadAcknowledge(); Stop_label_24c01_write_2byte: i2c_Stop(); }
/*! * Read a register from the MPR084 * @param u8RegisterAddress is Register Address * @return Data stored in Register */ unsigned char i2cMultiReadRegister(uint8_t Address, uint8_t u8RegisterAddress, uint8_t *DataBlock, uint8_t ReadSize) { uint8_t result = 0; unsigned int j; /* Send Slave Address */ IIC_StartTransmission(Address,SlaveID,MWSR); i2c_Wait(); /* Write Register Address */ I2C0_D = u8RegisterAddress; i2c_Wait(); /* Do a repeated start */ I2C0_C1 |= I2C_C1_RSTA_MASK; /* Send Slave Address */ I2C0_D = (Address << 1) | 0x01; //read address i2c_Wait(); /* Put in Rx Mode */ I2C0_C1 &= (~I2C_C1_TX_MASK); I2C0_C1 &= (~I2C_C1_TXAK_MASK); /* Turn off ACK */ // I2C0_C1 |= I2C_C1_TXAK_MASK; /* Dummy read */ result = I2C0_D ; for (j=0; j<5000; j++){}; i2c_Wait(); result = 0; while(ReadSize--) { DataBlock[result++] = I2C0_D; i2c_Wait(); if(ReadSize == 1) { /* Turn off ACK */ I2C0_C1 |= I2C_C1_TXAK_MASK; } } /* Send stop */ i2c_Stop(); DataBlock[result] = I2C0_D ; Pause(); return result; }
/* ********************************************************************************************************* * 函 数 名: i2c_CfgGpio * 功能说明: 配置I2C总线的GPIO,采用模拟IO的方式实现 * 形 参:无 * 返 回 值: 无 ********************************************************************************************************* */ static void i2c_CfgGpio(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_I2C_PORT, ENABLE); /* 打开GPIO时钟 */ GPIO_InitStructure.GPIO_Pin = I2C_SCL_PIN | I2C_SDA_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; /* 开漏输出 */ GPIO_Init(GPIO_PORT_I2C, &GPIO_InitStructure); /* 给一个停止信号, 复位I2C总线上的所有设备到待机模式 */ i2c_Stop(); }
/*! * Read first three registers from the MMA7660 * @param u8RegisterAddress is Register Address * @return Data stored in Register */ unsigned char u8MMA7660ReadThreeRegisters(unsigned char u8RegisterAddress) { unsigned char result1, result2, result3; /* Send Slave Address */ IIC_StartTransmission(SlaveID,MWSR); i2c_Wait(); /* Write Register Address */ I2C0_D = u8RegisterAddress; i2c_Wait(); /* Do a repeated start */ I2C0_C1 |= I2C_C1_RSTA_MASK; /* Send Slave Address */ I2C0_D = (MMA7660_I2C_ADDRESS << 1) | 0x01; //read address i2c_Wait(); /* Put in Rx Mode */ I2C0_C1 &= (~I2C_C1_TX_MASK); /* Ensure TXAK bit is 0 */ I2C0_C1 &= ~I2C_C1_TXAK_MASK; /* Dummy read */ result1 = I2C0_D ; i2c_Wait(); /* Read first byte */ result1 = I2C0_D; i2c_Wait(); /* Turn off ACK since this is second to last read*/ I2C0_C1 |= I2C_C1_TXAK_MASK; /* Read second byte */ result2 = I2C0_D; i2c_Wait(); /* Send stop */ i2c_Stop(); /* Read third byte */ result3 = I2C0_D; printf("%3d %3d %3d\n",result1,result2,result3); return result1; }
/* ********************************************************************************************************* * 函 数 名: i2c_CheckDevice * 功能说明: 检测I2C总线设备,CPU向发送设备地址,然后读取设备应答来判断该设备是否存在 * 形 参:_Address:设备的I2C总线地址 * 返 回 值: 返回值 0 表示正确, 返回1表示未探测到 ********************************************************************************************************* */ uint8_t i2c_CheckDevice(uint8_t _Address) { uint8_t ucAck; i2c_Cfg(); /* 配置GPIO及速度*/ i2c_Start(); /* 发送启动信号 */ /* 发送设备地址+读写控制bit(0 = w, 1 = r) bit7 先传 */ i2c_SendByte(_Address | I2C_WR); ucAck=i2c_WaitAck(); i2c_Stop(); /* 发送停止信号 */ return ucAck; }
void i2c_write_reg(I2Cn_e i2cn, uint8 SlaveID, uint8 reg, uint8 Data) { i2c_Start(i2cn); //发送启动信号 i2c_write_byte(i2cn, ( SlaveID << 1 ) | MWSR); //发送从机地址和写位 i2c_write_byte(i2cn, reg); //发送从机里的寄存器地址 i2c_write_byte(i2cn, Data); //发送需要写入的数据 i2c_Stop(i2cn); Pause(); //延时太短的话,可能写出错 }
/* ********************************************************************************************************* * 函 数 名: MPU6050_WriteByte * 功能说明: 向 MPU-6050 寄存器写入一个数据 * 形 参: _ucRegAddr : 寄存器地址 * _ucRegData : 寄存器数据 * 返 回 值: 无 ********************************************************************************************************* */ void MPU6050_WriteByte(uint8_t _ucRegAddr, uint8_t _ucRegData) { i2c_Start(); /* 总线开始信号 */ i2c_SendByte(MPU6050_SLAVE_ADDRESS); /* 发送设备地址+写信号 */ i2c_WaitAck(); i2c_SendByte(_ucRegAddr); /* 内部寄存器地址 */ i2c_WaitAck(); i2c_SendByte(_ucRegData); /* 内部寄存器数据 */ i2c_WaitAck(); i2c_Stop(); /* 总线停止信号 */ }
/*! * Write a byte of Data to specified register on I2C0 bus * @param Address I2C bus address * @param u8RegisterAddress is Register Address * @param u8Data is Data to write */ void i2cWriteRegister(uint8_t Address, uint8_t u8RegisterAddress, uint8_t u8Data) { /* send data to slave */ IIC_StartTransmission(Address,SlaveID,MWSR); i2c_Wait(); I2C0_D = u8RegisterAddress; i2c_Wait(); I2C0_D = u8Data; i2c_Wait(); i2c_Stop(); Pause(); }
/************************************************************************* * 野火嵌入式开发工作室 * * 函数名称:I2C_WriteAddr * 功能说明:写入一个字节数据到I2C设备指定寄存器地址 * 参数说明:I2Cn 模块号(I2C0、I2C1) * SlaveID 7位从机地址 * Addr 从机的寄存器地址 * Data 数据 * 函数返回:无 * 修改时间:2012-1-20 * 备 注: *************************************************************************/ void I2C_WriteAddr(I2Cn i2cn, u8 SlaveID, u8 Addr, u8 Data) { /* send data to slave */ I2C_StartTransmission(i2cn, SlaveID, MWSR); //启动传输 i2c_Wait(i2cn); i2c_write_byte(i2cn, Addr); //写地址 i2c_Wait(i2cn); i2c_write_byte(i2cn, Data); //写数据 i2c_Wait(i2cn); i2c_Stop(i2cn); Pause(); //延时太短的话,可能写出错 }
/*! * Write a byte of Data to specified register on MMA7660 * @param u8RegisterAddress is Register Address * @param u8Data is Data to write */ void I2CWriteRegister(unsigned char u8RegisterAddress, unsigned char u8Data) { /* send data to slave */ IIC_StartTransmission(SlaveID,MWSR); i2c_Wait(); I2C0_D = u8RegisterAddress; i2c_Wait(); I2C0_D = u8Data; i2c_Wait(); i2c_Stop(); Pause(); }