示例#1
0
//============================================================================
//函数名称: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,可以产生停止信号
        }
    }



}
示例#2
0
文件: i2c.c 项目: MorS25/amcfc
void send_signal(uint8 Signal)
{
    if (Signal == 'S')
    {    
        i2c0_Start(); //主机模式选择位MST由0变为1,可以产生开始信号  
    }  
    else if (Signal == 'O')
    {
        i2c0_Stop();//主机模式选择位MST由1变为0,可以产生停止信号
    }
}
示例#3
0
文件: i2c.c 项目: MorS25/amcfc
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();
}
示例#5
0
/*
*********************************************************************************************************
*	函 数 名: 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();
}
示例#6
0
/*
*********************************************************************************************************
*	函 数 名: 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;
}