1. 程式人生 > >STM32F1 硬體I2C驅動DAC(LTC2605)

STM32F1 硬體I2C驅動DAC(LTC2605)

#include "i2c_drive_mcp.h"

#define I2C_Speed     100000

#define Master_Address 0x0A  //全部通道

static void I2C_GPIO_Config(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    
    /*Enable the Clock*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);  
    
    /* Config :PB6-I2C1_SCL¡¢PB7-I2C1_SDA*/
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
}

static void I2C_Mode_Config(void)
{
        
    I2C_InitTypeDef  I2C_InitStructure; 
    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    I2C_InitStructure.I2C_OwnAddress1=Master_Address;  
    I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;

    I2C_Init(I2C1, &I2C_InitStructure);
    //I2C_DeInit(I2C2);    
    I2C_Cmd(I2C1, ENABLE);
    I2C_AcknowledgeConfig(I2C1, ENABLE);
    
}

void I2C_LTC2605_Init(void)
{
    I2C_GPIO_Config();
    I2C_Mode_Config();
}

void GeneralCall_Reset(void)
{
   I2C_GenerateSTART(I2C1, ENABLE);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));  
    
    I2C_Send7bitAddress(I2C1, 0x20, I2C_Direction_Transmitter);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
    
    I2C_SendData(I2C1, 0x06); 
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

    
    I2C_GenerateSTOP(I2C1, ENABLE);
    
}

u8 Config_Write(void)
{
 

    I2C_GenerateSTART(I2C1, ENABLE);
    
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));  

    I2C_Send7bitAddress(I2C1, 0x10, I2C_Direction_Transmitter);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
     
    I2C_SendData(I2C1, 0x80); 
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

    
    I2C_GenerateSTOP(I2C1, ENABLE);
    return 0;
}

u8 read_command(void)
{
    u8 Data[3],result=0;
    
    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
        
    I2C_GenerateSTART(I2C1, ENABLE);

    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); 

    I2C_Send7bitAddress(I2C1, 0xc1, I2C_Direction_Receiver);
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
    
    Data[0]=I2C_ReceiveData(I2C1);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
    
    Data[1]=I2C_ReceiveData(I2C1);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
    
    Data[2]=I2C_ReceiveData(I2C1);

    
    I2C_AcknowledgeConfig(I2C1, DISABLE);
            I2C_GenerateSTOP(I2C1, ENABLE);
    if(((Data[0]>>6)&0x01)!=0x01)
    {
            result=1;
  }
    
    if(((Data[0]>>7)&0x01)!=0x01)
    {
            result=2;
  }
    I2C_AcknowledgeConfig(I2C1, ENABLE);
    return result;
}

u8 Write_Temp_Value(u16 temp_input)
{
    u8 Data[2];

    I2C_GenerateSTART(I2C1, ENABLE);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));  
    
    I2C_Send7bitAddress(I2C1, 0x20, I2C_Direction_Transmitter);
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))

    Data[0]= temp_input&0x00ff;
  Data[1]= (temp_input>>8)&0x00ff;
    
    I2C_SendData(I2C1,0x22);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
    
    I2C_SendData(I2C1,Data[1]);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
    
    I2C_SendData(I2C1,Data[0]); 
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
    
    I2C_GenerateSTOP(I2C1, ENABLE);
    return 0;
}
    
    
u8 Write_Pre_In(u16 pre_In_input)
{
    u8 Data[2];

    I2C_GenerateSTART(I2C1, ENABLE);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));  
    
    I2C_Send7bitAddress(I2C1, 0x20, I2C_Direction_Transmitter);
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))

    Data[0]= pre_In_input&0x00ff;
  Data[1]= (pre_In_input>>8)&0x00ff;
    
    I2C_SendData(I2C1,0x21);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
    
    I2C_SendData(I2C1,Data[1]);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
    
    I2C_SendData(I2C1,Data[0]); 
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
    
    I2C_GenerateSTOP(I2C1, ENABLE);
    return 0;
}

u8 Write_Pre_Out(u16 pre_Out_input)
{
    u8 Data[2];

    I2C_GenerateSTART(I2C1, ENABLE);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));  
    
    I2C_Send7bitAddress(I2C1, 0x20, I2C_Direction_Transmitter);
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))

    Data[0]= pre_Out_input&0x00ff;
  Data[1]= (pre_Out_input>>8)&0x00ff;
    
    I2C_SendData(I2C1,0x20);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
    
    I2C_SendData(I2C1,Data[1]);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
    
    I2C_SendData(I2C1,Data[0]); 
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
    
    I2C_GenerateSTOP(I2C1, ENABLE);
    return 0;
}

 

 

int main(void){

    I2C_GPIO_Config();
    I2C_Mode_Config();

   Write_Temp_Value(65535); 

}