//============================================================================ //函数名称:hw_send_signal //功能概要:根据需要产生开始或停止信号 。 //参数说明: MoudleNum:模块号 // Signal: 'S'(Start),产生开始信号 'O'(Over), 产生停止信号 //函数返回:无 //============================================================================ void hw_send_signal(uint8 Signal,int MoudleNum) { //获取i2c模块基址 I2C_MemMapPtr num = hw_i2c_get_base_address(MoudleNum); if(num == I2C0)//模块0 { if (Signal == 'S') { i2c0_Start(); //主机模式选择位MST由0变为1,可以产生开始信号 } else if (Signal == 'O') { i2c0_Stop();//主机模式选择位MST由1变为0,可以产生停止信号 } } else if(num == I2C1)//模块1 { if (Signal == 'S') { i2c1_Start(); //主机模式选择位MST由0变为1,可以产生开始信号 } else if (Signal == 'O') { i2c1_Stop();//主机模式选择位MST由1变为0,可以产生停止信号 } } }
void send_signal(uint8 Signal) { if (Signal == 'S') { i2c0_Start(); //主机模式选择位MST由0变为1,可以产生开始信号 } else if (Signal == 'O') { i2c0_Stop();//主机模式选择位MST由1变为0,可以产生停止信号 } }
uint8 i2c_ReadMultiByte(uint8 SlaveAddress,uint8 AccessAddress,uint8 *Data,uint8 Length) { uint8 i; I2C0_C1 |= 0x10; send_signal('S'); //发送开始信号 I2C0_D = SlaveAddress; //发送设备地址,并通知从机接收数据 if (i2c_wait('T')) //等待一个字节数据传送完成 return 1; //没有传送成功,读一个字节失败 if (i2c_wait('A')) //等待从机应答信号 return 1; //没有等到应答信号,读一个字节失败 I2C0_D = AccessAddress; //发送访问地址 if (i2c_wait('T')) //等待一个字节数据传送完成 return 1; //没有传送成功,读一个字节失败 if (i2c_wait('A')) //等待从机应答信号 return 1; //pause(); I2C0_C1 |= I2C_C1_RSTA_MASK; I2C0_D = SlaveAddress+1; //通知从机改为发送数据 if (i2c_wait('T')) //等待一个字节数据传送完成 return 1; //没有传送成功,读一个字节失败 if (i2c_wait('A')) //等待从机应答信号 return 1; //没有等到应答信号,读一个字节失败 I2C0_C1 &= ~I2C_C1_TX_MASK; I2C0_C1 &= ~I2C_C1_TXAK_MASK; *Data = I2C0_D; if (i2c_wait('T')) //等待一个字节数据传送完成 return 1; //没有传送成功,读一个字节失败 for(i=0;i<Length-2;i++) { *(Data+i)=I2C0_D; if (i2c_wait('T')) //等待一个字节数据传送完成 return 1; } //没有传送成功,读一个字节失败 *(Data+Length-2) = I2C0_D; I2C0_C1 |= I2C_C1_TXAK_MASK; if (i2c_wait('T')) //等待一个字节数据传送完成 return 1; //没有传送成功,读一个字节失败 i2c0_Stop(); *(Data+Length-1) = I2C0_D; pause(); return 0; }
/*! * Write a byte of Data to specified register on MPR084 * @param u8RegisterAddress is Register Address * @param u8Data is Data to write */ void I2C_WriteRegister(unsigned char u8I2CSlaveAddress,unsigned char u8RegisterAddress, unsigned char u8Data) { /* send data to slave */ IIC_StartTransmission(u8I2CSlaveAddress,MWSR); i2c0_Wait(); I2C0_D = u8RegisterAddress; i2c0_Wait(); I2C0_D = u8Data; i2c0_Wait(); i2c0_Stop(); Pause(); }
/* ********************************************************************************************************* * 函 数 名: bsp_InitI2C * 功能说明: 配置I2C总线的GPIO,采用模拟IO的方式实现 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void bsp_InitI2C0(void) { GPIO_InitTypeDef GPIO_InitStructure; Mem_Set(&GPIO_InitStructure, 0x00, sizeof(GPIO_InitTypeDef)); RCC_AHB1PeriphClockCmd(RCC_I2C_PORT, ENABLE); /* 打开GPIO时钟 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; /* 设为输出口 */ GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; /* 设为开漏模式 */ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; /* 上下拉电阻不使能 */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; /* IO口最大速度 */ GPIO_InitStructure.GPIO_Pin = I2C_SCL_PIN | I2C_SDA_PIN; GPIO_Init(GPIO_PORT_I2C, &GPIO_InitStructure); /* 给一个停止信号, 复位I2C总线上的所有设备到待机模式 */ i2c0_Stop(); }
/* ********************************************************************************************************* * 函 数 名: i2c_CheckDevice * 功能说明: 检测I2C总线设备,CPU向发送设备地址,然后读取设备应答来判断该设备是否存在 * 形 参: _Address:设备的I2C总线地址 * 返 回 值: 返回值 0 表示正确, 返回1表示未探测到 ********************************************************************************************************* */ uint8_t i2c0_CheckDevice(uint8_t _Address) { uint8_t ucAck; if (I2C_SDA_READ() && I2C_SCL_READ()) { i2c0_Start(); /* 发送启动信号 */ /* 发送设备地址+读写控制bit(0 = w, 1 = r) bit7 先传 */ i2c0_SendByte(_Address | I2C0_WR); ucAck = i2c0_WaitAck(); /* 检测设备的ACK应答 */ i2c0_Stop(); /* 发送停止信号 */ return ucAck; } return 1; /* I2C总线异常 */ }
/*! * Read a register from the MPR084 * @param u8RegisterAddress is Register Address * @return Data stored in Register */ unsigned char I2C_ReadRegister(unsigned char u8I2CSlaveAddress,unsigned char u8RegisterAddress) { unsigned char result; unsigned int j; /* Send Slave Address */ IIC_StartTransmission(u8I2CSlaveAddress,MWSR); i2c0_Wait(); /* Write Register Address */ I2C0_D = u8RegisterAddress; i2c0_Wait(); /* Do a repeated start */ I2C0_C1 |= I2C_C1_RSTA_MASK; /* Send Slave Address */ I2C0_D = (u8I2CSlaveAddress << 1) | 0x01; //read address i2c0_Wait(); /* Put in Rx Mode */ I2C0_C1 &= (~I2C_C1_TX_MASK); /* Turn off ACK */ I2C0_C1 |= I2C_C1_TXAK_MASK; /* Dummy read */ result = I2C0_D ; for (j=0; j<5000; j++){}; //not sure why need delay i2c0_Wait(); /* Send stop */ i2c0_Stop(); result = I2C0_D ; Pause(); return result; }