Пример #1
0
/*
*********************************************************************************************************
*	函 数 名: 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;
}
Пример #2
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;
	}
Пример #3
0
//-----------------------------------------------
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;
}
Пример #4
0
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;	
}
Пример #5
0
/*
*********************************************************************************************************
*	函 数 名: 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();
}
Пример #6
0
/*!
 *  @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;
}
Пример #7
0
/*
*********************************************************************************************************
*	函 数 名: 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;
}
Пример #8
0
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();
}
Пример #9
0
/*!
 * 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;
}
Пример #10
0
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;
}
Пример #11
0
//////////////////////////////////////////////////////////////////////////
// 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;
}
Пример #12
0
/*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;
}
Пример #13
0
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
}
Пример #14
0
/*
*********************************************************************************************************
*	函 数 名: 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;
}
Пример #15
0
	/*
	*********************************************************************************************************
	*	函 数 名: 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;
	}
Пример #16
0
/*!
 * 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;
}
Пример #17
0
/*******************************************************************************
 * 名    称: 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();
}
Пример #18
0
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;
}
Пример #19
0
/*!
 * 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;
	}
}
Пример #21
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();
}
Пример #22
0
/*!
 * 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();
}
Пример #24
0
/*!
 * 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;
}
Пример #25
0
/*
*********************************************************************************************************
*	函 数 名: 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;
}
Пример #26
0
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();                                            //延时太短的话,可能写出错
}
Пример #27
0
/*
*********************************************************************************************************
*	函 数 名: 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();                   			/* 总线停止信号 */
}
Пример #28
0
/*!
 * 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();
}
Пример #29
0
/*************************************************************************
*                             野火嵌入式开发工作室
*
*  函数名称: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();                                        //延时太短的话,可能写出错
}
Пример #30
0
/*!
 * 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();
}