byte MP3Player::i2c_rx(byte ack)
{
  byte x, d=0;
  SDA_H(); 
  for(x=0; x<8; x++) 
  {
    d <<= 1;
    do {
      SCL_H();
    }
    while(SCL_IN()==0);    // wait for any SCL clock stretching
    i2c_dly();
    if(SDA_IN()) d |= 1;
    SCL_L(); 
  }
  if(ack) 
  {
    SDA_L(); 
  }
  else 
  {
    SDA_H(); 
  }
  SCL_H()
  i2c_dly();             // send (N)ACK bit
  SCL_L(); 
  SDA_H(); 
  return d;
}
byte MP3Player::i2c_tx(byte d)
{
  byte x;
  byte b;
  for(x=8; x; x--)
  {
    if(d&0x80)
    { 
      SDA_H(); 
    }
    else 
    {
      SDA_L();
    }
    SCL_H(); 
    d <<= 1;
    SCL_L(); 
  }
  SDA_H();
  SCL_H(); 
  i2c_dly();
  b = SDA_IN();          // possible ACK bit
  SCL_L(); 
  return b;
}
Exemplo n.º 3
0
/*!
 *  @brief      接收SCCB总线的数据
 *  @return     接收到的数据
 *  @since      v5.0
 */
static int SCCB_ReceiveByte(void)
{
    uint8 i = 8;
    uint8 ReceiveByte = 0;

    //SDA_H();
    //SCCB_DELAY();
    SDA_DDR_IN();

    while(i--)
    {
        ReceiveByte <<= 1;
        SCL_L();
        SCCB_DELAY();
        SCL_H();
        SCCB_DELAY();

        if(SDA_IN())
        {
            ReceiveByte |= 0x01;
        }


    }
    SDA_DDR_OUT();
    SCL_L();
    return ReceiveByte;
}
Exemplo n.º 4
0
/*!
 *  @brief      SCCB起始信号
 *  @since      v5.0
 */
static uint8 SCCB_Start(void)
{
    SDA_H();
    SCL_H();
    SCCB_DELAY();

    SDA_DDR_IN();
    if(!SDA_IN())
    {
        SDA_DDR_OUT();
        return 0;   /* SDA线为低电平则总线忙,退出 */
    }
    SDA_DDR_OUT();
    SDA_L();

    SCCB_DELAY();
    SCL_L();

    if(SDA_IN())
    {
        SDA_DDR_OUT();
        return 0;   /* SDA线为高电平则总线出错,退出 */
    }
    //SDA_DDR_OUT();
    //SDA_L();
    //SCCB_delay();
    return 1;
}
void MP3Player::i2c_stop(void)
{
  SDA_L();             // i2c stop bit sequence
  i2c_dly();
  SCL_H(); 
  i2c_dly();
  SDA_H(); 
  i2c_dly();
}
Exemplo n.º 6
0
/**
 * \brief I2C Stop,Internal function
 * \retval None
 */
static void I2C_Stop(void)
{
    SCL_L();
    SDA_L();
    I2C_DELAY();
    SCL_H();
    SDA_H();
    I2C_DELAY();
}
Exemplo n.º 7
0
/**
 * \brief I2C Ack,Internal function
 * \retval None
 */
static void I2C_Ack(void)
{
    SCL_L();
    SDA_L();
    I2C_DELAY();
    SCL_H();
    I2C_DELAY();
    SCL_L();
    I2C_DELAY();
}
Exemplo n.º 8
0
/*******************************************************************************
* 函数名称:TWI_SendACK                                                                     
* 描    述:收到数据,发送ACK                                                                                                                                        
*******************************************************************************/
static void IIC_SendACK(void)
{
	SCL_L();
	SDA_L();
	IIC_Dealy();
	SCL_H();
	IIC_Dealy();
	SCL_L(); 
	IIC_Dealy();
}
Exemplo n.º 9
0
/*******************************************************************
TWI_STOP
发送停止数据
*******************************************************************/
static void IIC_Stop(void)
{
	SDA_L();
	SCL_H();
	IIC_Dealy();

	SDA_H();
	IIC_Dealy();
	SDA_H();
}
Exemplo n.º 10
0
/**
 * \brief I2C Start,Internal function
 * \retval true
 */
static bool I2C_Start(void)
{
    SDA_DDR_OUT();
    SDA_H();
    SCL_H();
    I2C_DELAY();
    SDA_L();
    I2C_DELAY();
    SCL_L();
    return true;
}
Exemplo n.º 11
0
/*!
 *  @brief      SCCB应答信号
 *  @since      v5.0
 */
static void SCCB_Ack(void)
{
    SCL_L();
    SCCB_DELAY();
    SDA_L();
    SCCB_DELAY();
    SCL_H();
    SCCB_DELAY();
    SCL_L();
    SCCB_DELAY();
}
Exemplo n.º 12
0
/*!
 *  @brief      SCCB停止信号
 *  @since      v5.0
 */
static void SCCB_Stop(void)
{
    SCL_L();
    //SCCB_DELAY();
    SDA_L();
    SCCB_DELAY();
    SCL_H();
    SCCB_DELAY();
    SDA_H();
    SCCB_DELAY();
}
Exemplo n.º 13
0
/*******************************************************************************
 * 函数名称:TWI_SendByte                                                                     
 * 描    述:发送一个字节                                                                                                                                      
 *******************************************************************************/
static u8 IIC_SendByte(u8 Data)
{
	 uint8_t i;
	
	
	 for(i=0;i<8;i++)
	 {  
		  SCL_L();
		IIC_Dealy();
		if(Data&0x80)
		{
			SDA_H();
		}
		else
		{
			SDA_L();
		} 
		Data<<=1;
		IIC_Dealy();
		SCL_H(); 
		IIC_Dealy();
		 
	 }
	 //接收从机的应答  
	 SCL_L(); 
	 IIC_Dealy();
	 SCL_H();
	 IIC_Dealy(); 
 
	 if(IIC_SDA_STATE)
	 {
		printf("no ack");
		SCL_L();
		return IIC_NACK;
	 }
	 else
	 {	
		 SCL_L();
		return IIC_ACK;  
	 }    
}
Exemplo n.º 14
0
/**
 * \brief I2C Wait Ack,Internal function
 * \return 应答信号
 */
static bool I2C_WaitAck(void)
{
    uint8_t ack;
    SDA_DDR_IN();
    SCL_L();
    
    I2C_DELAY();
    SCL_H();
    I2C_DELAY();
    ack = SDA_IN();
    SCL_L();
    SDA_DDR_OUT();
    
    return ack;
}
Exemplo n.º 15
0
void I2C_GPIO_Configuration(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure; 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	/* Configure I2C1 pins: SCL and SDA */
	GPIO_InitStructure.GPIO_Pin =  IIC_SCL_Pin | IIC_SDA_Pin;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;

	GPIO_Init(IIC_GPIO, &GPIO_InitStructure);

	SDA_H();
	SCL_H();
}
Exemplo n.º 16
0
/**
 * \brief I2C 发送一个字节数据,Internal function
 * \param[in] data 待发送的数据(字节)
 * \retval None
 */
static void I2C_SendByte(uint8_t data)
{
    volatile uint8_t i;
    
    i = 8;
    while(i--)
    {
        if(data & 0x80) SDA_H();
        else SDA_L();
        data <<= 1;
        I2C_DELAY();
        SCL_H();
        I2C_DELAY();
        SCL_L();
    }

}
Exemplo n.º 17
0
/**
 * \brief I2C 接收一个字节数据,Internal function
 * \return 待接收的数据(字节)
 */
static uint8_t I2C_GetByte(void)
{
    uint8_t i,byte;
    
    i = 8;
    byte = 0;

    SDA_DDR_IN();
    while(i--)
    {
        SCL_L();
        I2C_DELAY();
        SCL_H();
        I2C_DELAY();
        byte = (byte<<1)|(SDA_IN() & 1);
    }
    SCL_L();
    SDA_DDR_OUT();
    return byte;
}
Exemplo n.º 18
0
/*******************************************************************
TWI_START
发送启动数据
*******************************************************************/
static uint8_t IIC_Start(void)
{
	SDA_H();
	SCL_H();
	IIC_Dealy();

	if( IIC_SDA_STATE == RESET )
	{
		return IIC_BUS_BUSY;
	}

	SDA_L();
	IIC_Dealy();

	if( IIC_SDA_STATE == SET )
	{
		return IIC_BUS_ERROR;
	}

	return IIC_BUS_READY;
}
Exemplo n.º 19
0
/*!
 *  @brief      SCCB 等待应答
 *  @return     应答结果(0表示无应答,1表示有应答)
 *  @since      v5.0
 */
static int SCCB_WaitAck(void)
{
    SCL_L();
    //SDA_H();
    SDA_DDR_IN();

    SCCB_DELAY();
    SCL_H();

    SCCB_DELAY();

    if(SDA_IN())           //应答为高电平,异常,通信失败
    {
        SDA_DDR_OUT();
        SCL_L();
        return 0;
    }
    SDA_DDR_OUT();
    SCL_L();
    return 1;
}
Exemplo n.º 20
0
/*******************************************************************************
 * 函数名称:TWI_ReceiveByte                                                                     
 * 描    述:接收一个字节                                                                                                                                       
 *******************************************************************************/
static char IIC_RecvByte(void)
{
	 char i,Dat = 0;
	 SDA_H();
	 Dat=0;

	 for(i=0;i<8;i++)
	 {
		SCL_L();
		 IIC_Dealy();
		 SCL_H();//产生时钟上升沿[正脉冲],让从机准备好数据 
		IIC_Dealy(); 
		Dat<<=1;
		if(IIC_SDA_STATE) //读引脚状态
		{
			Dat|=0x01; 
		}       
	 }
	 
	 return Dat;
}
Exemplo n.º 21
0
/********************************************************************
 * 函数名:SCCB_WaitAck
 * 描述  :SCCB 等待应答
 * 输入  :无
 * 输出  :返回为:=1有ACK,=0无ACK
 * 注意  :内部调用        
 ********************************************************************/
static int SCCB_WaitAck(void) 	
{
	SCL_L();
	SCCB_DELAY();
	SDA_H();	
	SCCB_DELAY();
	
	SCL_H();
	
	SDA_DDR_IN();
	SCCB_DELAY();

	if(SDA_IN())
	{
		SDA_DDR_OUT();
      	SCL_L();
      	return 0;
	}
	SDA_DDR_OUT();
	SCL_L();
	return 1;
}
Exemplo n.º 22
0
 /*******************************************************************
 * 函数名:SCCB_SendByte
 * 描述  :数据从高位到低位
 * 输入  :SendByte: 发送的数据
 * 输出  :无
 * 注意  :内部调用        
 *********************************************************************/
static void SCCB_SendByte(uint8 SendByte) 
{
    uint8 i=8;
    while(i--)
    {
        SCL_L();
        SCCB_DELAY();
      	if(SendByte&0x80)
		{
			SDA_H(); 
		}
      	else 
		{
			SDA_L();   
		}
        SendByte<<=1;
        SCCB_DELAY();
		SCL_H();
        SCCB_DELAY();
    }
    SCL_L();
}
Exemplo n.º 23
0
/*!
 *  @brief      SCCB 发送的数据
 *  @param      SendByte    需要发送的数据
 *  @since      v5.0
 */
static void SCCB_SendByte(uint8 SendByte)
{
    uint8 i = 8;
    while(i--)
    {

        if(SendByte & 0x80)     //SDA 输出数据
        {
            SDA_H();
        }
        else
        {
            SDA_L();
        }
        SendByte <<= 1;
        SCCB_DELAY();
        SCL_H();                //SCL 拉高,采集信号
        SCCB_DELAY();
        SCL_L();                //SCL 时钟线拉低
        //SCCB_DELAY();
    }
    //SCL_L();
}