Beispiel #1
0
int SCCB_ReadSingleRegister(uint32_t instance, uint8_t chipAddr, uint8_t subAddr, uint8_t* pData)
{
    uint32_t time_out = 0;
    I2C_GenerateSTART(instance);
    /* Send 7bit Data with WRITE operation */
    I2C_Send7bitAddress(instance, chipAddr, kI2C_Write);
    if(I2C_WaitAck(instance))
    {
        I2C_GenerateSTOP(instance);
        time_out = 0;
        while(!I2C_IsBusy(instance) && (time_out < 10000))
        {
            time_out++;
        }
        return 1;
    }
    /* send reg address */
    I2C_SendData(instance, subAddr);
    if(I2C_WaitAck(instance))
    {
        I2C_GenerateSTOP(instance);
        time_out = 0;
        while(!I2C_IsBusy(instance)  && (time_out < 10000))
        {
            time_out++;
        }
        return 2;
    }
    I2C_GenerateSTOP(instance);
    while(!I2C_IsBusy(instance));
    time_out = 0;
    /* generate START signal */
    I2C_GenerateSTART(instance);
    /* resend 7bit Address, This time we use READ Command */
    I2C_Send7bitAddress(instance, chipAddr, kI2C_Read);
    if(I2C_WaitAck(instance))
    {
        I2C_GenerateSTOP(instance);
        time_out = 0;
        while(!I2C_IsBusy(instance));
        return 3;
    }
    /* set master in slave mode */
    I2C_SetMasterMode(instance,kI2C_Read);
    /* dummy read */
    I2C_ReadData(instance);
	I2C_GenerateAck(instance);
	I2C_WaitAck(instance);
    *pData = I2C_ReadData(instance);
    /* stop and finish */
    I2C_GenerateNAck(instance);
    I2C_WaitAck(instance);
    I2C_GenerateSTOP(instance);
    while(!I2C_IsBusy(instance));
    return 0;
}
Beispiel #2
0
uint8_t EEPROM24AA512ReadNByte(uint16_t Register, uint8_t *Data, uint8_t Num)
{
	if(I2C_ReadData(g_I2cHandleMaster,EEPROM24AA512_SLADDRESS,(uint16_t)Register,I2C_MEMADD_SIZE_16BIT, Data, Num) != HAL_OK)
	{
		 return 0; 
	}
	return 1;
}
/*bool getTimeAD5242BR(const uint8 contr, uint8 *position)
{
    TI2C_Result res;
    TINFO_AD5242 infoAD5242={0};
    validAD5242 = false;
    infoAD5242.control = contr;

    //I2C_SetBaudRate(DS1338_BAUDRATE);
    //__disable_interrupt();
    res = I2C_ReadData(AD5242_DEVICE_ADD,1,0x00,sizeof(TINFO_AD5242),(uint8*)&infoAD5242);
    //__enable_interrupt();
    if (res == I2C_RES_OK){
        *position = infoAD5242.data;
        validAD5242 = true;
    }
    return validAD5242;
}*/
bool getTimeAD5242BR(uint8 *position)
{
    TI2C_Result res;
    uint8 data = 0;
    validAD5242 = false;
    //I2C_SetBaudRate(DS1338_BAUDRATE);
    //__disable_interrupt();
    res = I2C_ReadData(AD5242_DEVICE_ADD,1,0x00,sizeof(data),(uint8*)&data);
    //__enable_interrupt();
    if (res == I2C_RES_OK){
        *position = data;
        validAD5242 = true;
    }
    return validAD5242;
}
Beispiel #4
0
void MPU6050_Read(void)
{
	__loop_cnt_gyro__ = (__loop_cnt_gyro__ < MPU6050_GYRO_BUFFER_LEN - 1 ? (__loop_cnt_gyro__ + 1) : 0);
	__loop_cnt_acc__ = (__loop_cnt_acc__ < MPU6050_ACC_BUFFER_LEN - 1 ? (__loop_cnt_acc__ + 1) : 0);
	uint8_t buffer[14];
	I2C_ReadData(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_ACCEL_XOUT_H, buffer, 14);
	while(I2C_isBusy());
	__average_buf_acc__[__loop_cnt_acc__][0] = (int16_t)((((uint16_t)buffer[0])<<8) | ((uint16_t)buffer[1]));// - __MPU6050_ACC_OFFSET.x;
	__average_buf_acc__[__loop_cnt_acc__][1] = (int16_t)((((uint16_t)buffer[2])<<8) | ((uint16_t)buffer[3]));// - __MPU6050_ACC_OFFSET.y;
	__average_buf_acc__[__loop_cnt_acc__][2] = (int16_t)((((uint16_t)buffer[4])<<8) | ((uint16_t)buffer[5]));// - __MPU6050_ACC_OFFSET.z;

	__average_buf_gyro__[__loop_cnt_gyro__][0] = (int16_t)((((uint16_t)buffer[8])<<8) | ((uint16_t)buffer[9])) - __MPU6050_GYRO_OFFSET.x;
	__average_buf_gyro__[__loop_cnt_gyro__][1] = (int16_t)((((uint16_t)buffer[10])<<8) | ((uint16_t)buffer[11])) - __MPU6050_GYRO_OFFSET.y;
	__average_buf_gyro__[__loop_cnt_gyro__][2] = (int16_t)((((uint16_t)buffer[12])<<8) | ((uint16_t)buffer[13])) - __MPU6050_GYRO_OFFSET.z;
	uint16tofloat();
}
Beispiel #5
0
uint8_t MPU6050_SelfAdjust(void)
{
	uint8_t buffer[14];					//iic读取后存放数据
	int32_t avg_value[7];
	//////////////////////////////////////////////////////////////////
	///////////////////////  Normal output  //////////////////////////
	//////////////////////////////////////////////////////////////////
	avg_value[0] = avg_value[1] = avg_value[2] = avg_value[3]
				= avg_value[4] = avg_value[5] = avg_value[6] = 0;
	uint32_t t = 0;
	__fixLoopPeriod(0,&t);
	for(int i = 0 ; i < 1024 ; i ++){
		__fixLoopPeriod(2000,&t);
		I2C_ReadData(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_ACCEL_XOUT_H, buffer, 14);
		while(I2C_isBusy());
		avg_value[0] += (int16_t)((((uint16_t)buffer[0])<<8) | ((uint16_t)buffer[1]));
		avg_value[1] += (int16_t)((((uint16_t)buffer[2])<<8) | ((uint16_t)buffer[3]));
		avg_value[2] += (int16_t)((((uint16_t)buffer[4])<<8) | ((uint16_t)buffer[5]));
		avg_value[4] += (int16_t)((((uint16_t)buffer[8])<<8) | ((uint16_t)buffer[9]));
		avg_value[5] += (int16_t)((((uint16_t)buffer[10])<<8) | ((uint16_t)buffer[11]));
		avg_value[6] += (int16_t)((((uint16_t)buffer[12])<<8) | ((uint16_t)buffer[13]));
	}
	float tmpx,tmpy,tmpz;
	tmpx = ((float)avg_value[0])*(ACC_MAX_SCALE/32768.0f/1024.0f*9.8f);
	tmpy = ((float)avg_value[1])*(ACC_MAX_SCALE/32768.0f/1024.0f*9.8f);
	tmpz = ((float)avg_value[2])*(ACC_MAX_SCALE/32768.0f/1024.0f*9.8f);
	attitude_gravity.x = (-tmpx + tmpy)*0.7071067812;
	attitude_gravity.y = (tmpx + tmpy)*0.7071067812;
	attitude_gravity.z = -tmpz;

	__MPU6050_GYRO_OFFSET.x = avg_value[4] >> 10;
	__MPU6050_GYRO_OFFSET.y = avg_value[5] >> 10;
	__MPU6050_GYRO_OFFSET.z = avg_value[6] >> 10;
	///////////////////////////////////////////////////////////////////////////////////////
	for(int i = 0 ; i < MPU6050_ACC_BUFFER_LEN || i < MPU6050_GYRO_BUFFER_LEN ; i++){
		__fixLoopPeriod(2000,&t);
		MPU6050_Read();
	}
	return 0;
}
Beispiel #6
0
/*主函数*/
void main()
{
	INT8U Temp_Key; //存放按键处理值
	BOOL I2C_OK;	//I2C读写是否成功(1成功,0失败)

	LCD1602_Init();  //LCD1602初始化
	IR_TX_RX_Init(); //IR发送、接收初始化
	I2C_Init();		 //I2C初始化
	Delay_Ms(50);

	LCD1602_Write_String(0, 0, "Welcome to use!");
	LCD1602_Write_String(0, 1, "IR Remote Module"); //欢迎文字
	Delay_Ms(5000);									//5秒延时

	LCD1602_Clear(); //LCD1602清屏
	LCD1602_Write_String(0, 0, "Switch Mode!");
	LCD1602_Write_String(0, 1, "Default CopyMode"); //功能选择提示文字

	while (1)
	{
		if (IR_RX_Finish) //IR是否接收完成
		{
			IR_RX_Finish = 0;
			LCD1602_Clear();

			/*LCD1602以16进制显示IR接收到的用户名与键值码*/
			LCD1602_Write_String(0, 1, INT8UtostrHEX(IR_RX_CODE[0]));
			LCD1602_Write_String(3, 1, INT8UtostrHEX(IR_RX_CODE[1]));
			LCD1602_Write_String(7, 1, INT8UtostrHEX(IR_RX_CODE[2]));
			LCD1602_Write_String(10, 1, INT8UtostrHEX(IR_RX_CODE[3]));
		}
		Temp_Key = KeyPro(); //提取按键处理值
		if (KeyPro_OK)		 //按键处理是否成功
		{
			KeyPro_OK = 0;
			if (TorR_Mod) //选择为发送模式
			{
				if (Temp_Key != 0xfd) //非选择模式按键按下(S3,发送模式)
				{
					do
					{
						I2C_OK = I2C_ReadData(Temp_Key);
					} while (!I2C_OK); //等待I2C读取发送码成功

					Transmit_TR_CODE(); //发送红外编码
					LCD1602_Clear();

					LCD1602_Write_String(0, 1, INT8UtostrHEX(Temp_Key)); //显示学习按键值
					LCD1602_Write_String(5, 1, INT8UtostrHEX(I2C_OK));   //显示成功读取IR_TX_CODE

					/*LCD1602以16进制显示从I2C取出的IR_TX_CODE*/
					LCD1602_Write_String(0, 0, INT8UtostrHEX(IR_TX_CODE[0]));
					LCD1602_Write_String(3, 0, INT8UtostrHEX(IR_TX_CODE[1]));
					LCD1602_Write_String(7, 0, INT8UtostrHEX(IR_TX_CODE[2]));
					LCD1602_Write_String(10, 0, INT8UtostrHEX(IR_TX_CODE[3]));
				}
				else //选择模式按键按下(S3)
				{
					LCD1602_Clear();
					LCD1602_Write_String(0, 0, "IR Transmit Mode");
					LCD1602_Write_String(3, 1, "Please Key!");
				}
			}
			else //学习模式
			{
				if (Temp_Key != 0xfe) //非选择模式按键按下(S2,学习模式)
				{
					LCD1602_Clear();
					LCD1602_Write_String(14, 1, INT8UtostrHEX(Temp_Key)); //显示按键值
					do
					{
						I2C_OK = I2C_WriteData(Temp_Key);
					} while (!I2C_OK);									//等待将接收红外码存入I2C成功

					LCD1602_Write_String(14, 0, INT8UtostrHEX(I2C_OK)); //显示存入成功
					Delay_Ms(100);
					/*从I2C读取刚存入的IR学习码*/
					I2C_ReadData(Temp_Key);
					LCD1602_Write_String(0, 0, INT8UtostrHEX(IR_TX_CODE[0]));
					LCD1602_Write_String(3, 0, INT8UtostrHEX(IR_TX_CODE[1]));
					LCD1602_Write_String(7, 0, INT8UtostrHEX(IR_TX_CODE[2]));
					LCD1602_Write_String(10, 0, INT8UtostrHEX(IR_TX_CODE[3]));
				}
				else //选择模式按键按下(S2,学习模式)
				{
					LCD1602_Clear();
					LCD1602_Write_String(0, 0, "IRcode Copy Mode");
					LCD1602_Write_String(0, 1, "Please In IRcode");
				}
			}
		}
	}
}
Beispiel #7
0
static bool I2C_RecvForHdmiPhy(I2C_CHANNEL eCh, u8 ucSlvAddr, u8 aData[], unsigned int nNumOfData)
{
	bool bResult = TRUE;
	unsigned int i;

	if (g_aI2c[eCh].eError == I2C_INVALID_TX_CLOCK)
	{
		bResult = FALSE;
		goto I2C_Stop;
	}
	
	//
	// I2C Phase - Check BUS Status
	//
	if (I2C_WaitForBusReady(eCh, g_aI2c[eCh].nTimeOut) == FALSE)
	{
		g_aI2c[eCh].eError = I2C_TIMEOUT_BUS_READY_START;
		return FALSE;
	}
	
	I2C_InitMaster(eCh, g_aI2c[eCh].ePrescaler, g_aI2c[eCh].nPrescaler);	// Init I2C

	//
	// I2C Phase - START
	//
	I2C_SetMode(eCh, MASTER_RX_MODE);										// Set Mode
	I2C_WriteAddress(eCh, ucSlvAddr);										// Write Slave Address
	I2C_GenerateSignal(eCh, START_CONDITION);								// Send START Signal
	if (!I2C_WaitForXferNoAck(eCh, g_aI2c[eCh].nTimeOut))						// Workaround for HDMI PHY
	{
		g_aI2c[eCh].eError = I2C_TIMEOUT_SLAVE_ADDRESS;
		goto I2C_Stop;
	}

	//
	// I2C Phase - Read Data
	//
	for (i = 0; i < nNumOfData; i++)
	{
		if (i < nNumOfData-1)
		{
			I2C_SetAckGeneration(eCh, TRUE);
			I2C_ClearIntStatus(eCh);
			if (I2C_WaitForXferNoAck(eCh, g_aI2c[eCh].nTimeOut) == FALSE)		// Workaround for HDMI PHY
			{
				g_aI2c[eCh].eError = I2C_TIMEOUT_SLAVE_ADDRESS;
				goto I2C_Stop;
			}

			aData[i] = I2C_ReadData(eCh);
		}
		else
		{
			I2C_SetAckGeneration(eCh, FALSE);
			I2C_ClearIntStatus(eCh);
			if (I2C_WaitForXferNoAck(eCh, g_aI2c[eCh].nTimeOut) == FALSE)
			{
				g_aI2c[eCh].eError = I2C_TIMEOUT_SLAVE_ADDRESS;
				goto I2C_Stop;
			}

			aData[i] = I2C_ReadData(eCh);
		}
	}

	g_aI2c[eCh].eError = I2C_SUCCESS;

I2C_Stop:

	//
	// I2C Phase - STOP
	//
	I2C_GenerateSignal(eCh, STOP_CONDITION);								// Send STOP Signal
	I2C_ClearIntStatus(eCh);

	I2C_SetMode(eCh, DISABLE_I2C);											// Deactivate I2C

	//
	// I2C Phase - Check BUS Status
	//
	if (I2C_WaitForBusReady(eCh, g_aI2c[eCh].nTimeOut) == FALSE)
	{
		g_aI2c[eCh].eError = I2C_TIMEOUT_BUS_READY_STOP;
		return FALSE;
	}

	I2C_PrintErrorCase(g_aI2c[eCh].eError);
	
	return bResult;
}
Beispiel #8
0
/**
 * @brief  设置i2c在主模式下的连续数据读操作
 * @code
 *     //使用i2c的1模块读取数据地址为0x55的从机中起始地址为0x01的数据10字节,存储在data的首地址
 *    I2C_BurstRead(HW_I2C1, 0x55, 0x01, 1, &data, 10);
 * @endcode
 * @param  instance :I2C模块号 
 *         @arg HW_I2C0  :I2C0模块
 *         @arg HW_I2C1  :I2C1模块
 *         @arg HW_I2C2  :I2C2模块
 * @param  deviceAddress :从机设备地址0~127
 * @param  subAddress    :读取的起始地址
 * @param  subAddressLen :地址的长度
 * @param  buf         :保存数据的首地址
 * @param  len       :读取数据的长度
 * @retval 数据的读取状态 0 ;成功 其它 :失败
 */
int32_t I2C_BurstRead(uint32_t instance, uint8_t deviceAddress, uint32_t subAddress, uint32_t subAddressLen, uint8_t* buf, uint32_t len)
{
    uint32_t time_out = 0;
    uint8_t i;
    uint8_t * p = (uint8_t*)&subAddress;
    /* generate START signal */
    I2C_GenerateSTART(instance);
    /* Send 7bit Data with WRITE operation */
    I2C_Send7bitAddress(instance, deviceAddress, kI2C_Write);
    if(I2C_WaitAck(instance))
    {
        I2C_GenerateSTOP(instance);
        time_out = 0;
        while(!I2C_IsBusy(instance) && (time_out < 10000))
        {
            time_out++;
        }
        return 1;
    }
    /* if len = 0 then return */
    if(!len)
    {
        I2C_GenerateSTOP(instance);
        while(!I2C_IsBusy(instance));
        return 0;
    }
    /* send sub address */
    for(i = 0; i < subAddressLen; i++)
    {
        /* send reg address */
        I2C_SendData(instance, *p++);
        if(I2C_WaitAck(instance))
        {
            I2C_GenerateSTOP(instance);
            time_out = 0;
            while(!I2C_IsBusy(instance)  && (time_out < 10000))
            {
                time_out++;
            }
            return 2;
        }
    }
    /* generate RESTART signal */
    I2C_GenerateRESTART(instance);
    /* resend 7bit Address, This time we use READ Command */
    I2C_Send7bitAddress(instance, deviceAddress, kI2C_Read);
    if(I2C_WaitAck(instance))
    {
        I2C_GenerateSTOP(instance);
        time_out = 0;
        while(!I2C_IsBusy(instance));
        return 3;
    }
    /* set master in slave mode */
    I2C_SetMasterMode(instance,kI2C_Read);
    /* dummy read */
    I2C_ReadData(instance); //dummy read
	I2C_GenerateAck(instance);
	I2C_WaitAck(instance);
    /* actually read */
	for(i = 0; i < len - 1; i++)
	{
		*(buf++) = I2C_ReadData(instance);
		I2C_GenerateAck(instance);
        I2C_WaitAck(instance);
	}
    /* read last */
	*buf = I2C_ReadData(instance);
    /* stop and finish */
    I2C_GenerateNAck(instance);
    I2C_WaitAck(instance);
    I2C_GenerateSTOP(instance);
    while(!I2C_IsBusy(instance));
    return 0;
}
Beispiel #9
0
//------------------------------------------------


void Flash_CheckBackupSlot(void)
{
    uint16 Addr;
    TI2C_Result res;

    SlotNumInBackup = -1;

    Addr = FlashInfo.BackupSlot*FlashInfo.SlotSize + FlashInfo.SlotDataSize + 2;

    if (FlashMode == FLASH_MODE_16K)
        res = I2C_ReadData(FLASH_DEVICE_ADDR|(Addr>>7)&0xFE, 1, Addr&0xFF, 2, FlashBuffer);
    else
        res = I2C_ReadData(FLASH_DEVICE_ADDR, 2, Addr, 2, FlashBuffer);

    if (res == I2C_RES_OK)
    {
        if (FlashBuffer[0]^FlashBuffer[1] == 0xFF)
        {
            SlotNumInBackup = FlashBuffer[0];
        }
    }
}

bool Flash_LoadDayPlan(uint8 Num)
{
    int  i;
    TI2C_Result res;
    uint16 CRC;