天天看點

建構驅動子產品2--STM32模拟IIC通路 (AT24C02)EEPROM 操作           建構驅動子產品2-- STM32模拟IIC通路 (AT24C02)EEPROM 操作

          建構驅動子產品2-- STM32模拟IIC通路 (AT24C02)EEPROM 操作

        模拟IIC接口可以使用任意兩個IO口實作,不受晶片引腳限制,而且硬體IIC在通信出錯後,無法自行恢複,模拟IIC則可以迅速恢複;通過調整延時參數,可以調節通路速度。本程式把模拟II2C封裝成一個子產品,AT24C02隻需要調用該子產品即可。

1、初始化EEPROM裝置。調用 EEPRomhardwareInit("24c02",0);接口即可。在裝置管理層生成一個EEPROM節點。

/**********************************************************************************************************
 *
 *  函數名:EEPRomhardwareInit
 *  功 能:
 *  參  數:
 *  傳回值:
 *  版 本:REV1.0.0          2016/04/27    Create
 *
 **********************************************************************************************************/
void EEPRomhardwareInit(ht_int8_t *name,ht_int16_t devno)//初始化EEPROM裝置 其中devno是挂載端口,devno=0 表示挂載到0硬體接口。
{
 char str[64];
	EEPRom_dev =(ht_device_t) cmMalloc(sizeof(struct ht_device) );
	 if(EEPRom_dev==NULL)
	{
		cmFault(SYS_ERROR_MEMMALLOC_ABNORMAL,RECORD_FLAG);
	}
	cmMemset(EEPRom_dev,0,sizeof(struct ht_device));
	EEPRom_dev -> open = bspEEPROMOpen;
	EEPRom_dev -> close = bspEEPROMClose;
	EEPRom_dev -> read = bspEEPROMRead;
	EEPRom_dev->control = NULL;
	EEPRom_dev->del=bspEEPROMdel;
	EEPRom_dev->help=bspEEPROMhelp;
	EEPRom_dev->write = bspEEPROMWrite;
	EEPRom_dev->user_privatedata = NULL;
	sprintf(str,"%s-%d",name,devno);
	if( gI2chardwareInit("Gi2c",devno)>0)
	{
  htDevFsRegister( EEPRom_dev,str);
	htDevFsAssociated(EEPRom_dev,"Gi2c",devno);
   
	}
	else
	{
		cmFree(EEPRom_dev);
	}
 
}
           

 2、實作open、Close、write、read、del等接口。

/**********************************************************************************************************
 *
 *  函數名:bspEEPROMWrite
 *  功 能:
 *  參  數:
 *  傳回值:
 *  版 本:REV1.0.0          2016/04/27    Create
 *
 **********************************************************************************************************/
ht_inline ht_int32_t bspEEPROMWrite  (ht_device_t dev, ht_uint32_t WriteAddr, const void *buffer, ht_int32_t NumByteToWrite)
{
	ht_int32_t iResult = NumByteToWrite;
	ht_uint8_t *Dat = (ht_uint8_t *)( buffer),i;
	ht_uint8_t buf[2];
	i2c_msg_t msg;
	htDevFsHandle i2cfd=NULL;
  if(dev->isChildFlag)//是否存在硬體操作接口
  i2cfd=htDevFsOpen(dev->childname,0);//接口名稱固定為"Gi2c"
	if(i2cfd==NULL)
	{
		return -1 ;
	}
	for(i=0;i<NumByteToWrite;i++)//寫資料到EEPROM
	{
	buf[0]=(ht_uint8_t)WriteAddr++;//設定位址
	buf[1]=Dat[i];//設定資料
	msg.pMsg=&buf[0];
	msg.Len=2;//傳輸長度
	msg.Stop=1;	//完成本次傳輸是否停止
	htDevFsControl(i2cfd,CMD_I2C_WRITE,(void*)&msg);//讀取操作指令
		OSTimeDlyHMSM(0,0,0,8);
	}
	htDevFsClose(i2cfd);
	return iResult;
} 
/**********************************************************************************************************
 *
 *  函數名:bspEEPROMRead
 *  功 能:
 *  參  數:
 *  傳回值:
 *  版 本:REV1.0.0          2016/04/27    Create
 *
 **********************************************************************************************************/
ht_inline ht_int32_t bspEEPROMRead  (ht_device_t dev, ht_uint32_t pos, void *buffer, ht_int32_t size)
{
	ht_int32_t iResult = size;
	ht_uint8_t *Dat = (ht_uint8_t *)( buffer),i;
	ht_uint8_t buf[2];
	i2c_msg_t msg;
	htDevFsHandle i2cfd=NULL;
  if(dev->isChildFlag)
  i2cfd=htDevFsOpen(dev->childname,0);
	if(i2cfd==NULL)
	{
		return -1 ;
	}
	for(i=0;i<size;i++)
	{
	buf[0]=(ht_uint8_t)pos++;//設定讀取位址
	msg.pMsg=&buf[0];//讀取位元組
	msg.Len=1;
	msg.Total=2;	
	htDevFsControl(i2cfd,CMD_I2C_WRITEREAD,(void*)&msg);//讀取操作指令
	Dat[i]=buf[1];
	
	}
	htDevFsClose(i2cfd);
	return iResult;
}
/**********************************************************************************************************
 *
 *  函數名:bspEEPROMOpen
 *  功 能:
 *  參  數:
 *  傳回值:
 *  版 本:REV1.0.0          2016/04/27    Create
 *
 **********************************************************************************************************/
ht_inline ht_int32_t bspEEPROMOpen (ht_device_t dev, ht_uint32_t oflag)
{

	i2c_cfg_t i2c_cfg;
	i2c_msg_t msg;
	htDevFsHandle i2cfd=NULL;
  if(dev->isChildFlag)
	{
  i2cfd=htDevFsOpen(dev->childname,0);
	if(i2cfd==NULL)
	{ 
		return -1;
	}
  }
	 //*設定IIC通路速度和裝置器件位址參數*//
	 i2c_cfg.hcfI2cDelayTime=16;
	 i2c_cfg.hcfSlaveAddress=0xa0;
	if(htDevFsControl(i2cfd,CMD_I2C_CFG,(void*)&i2c_cfg)<0)
	{
		 
		return -1;
	}
	htDevFsClose(i2cfd);
    return HT_EOK;
}
/**********************************************************************************************************
 *
 *  函數名:bspEEPROMClose
 *  功 能:
 *  參  數:
 *  傳回值:
 *  版 本:REV1.0.0          2016/04/27    Create
 *
 **********************************************************************************************************/
ht_inline ht_int32_t bspEEPROMClose (ht_device_t dev)
{
	return HT_EOK;
}
/**********************************************************************************************************
 *
 *  函數名:bspEEPROMdel
 *  功 能:
 *  參  數:
 *  傳回值:
 *  版 本:REV1.0.0          2016/04/27    Create
 *
 **********************************************************************************************************/
 ht_inline ht_int32_t   bspEEPROMdel(ht_device_t dev)
 {

	   ht_int8_t str[32];
	   htDevFsUnregister(dev);//解除安裝驅動
	   cmFree(dev);//釋放Device
	 return 1;
 }
 
 /**********************************************************************************************************
 *
 *  函數名:bspEEPROMhelp
 *  功 能:
 *  參  數:
 *  傳回值:
 *  版 本:REV1.0.0     
 * EEPROM測試操作
 **********************************************************************************************************/
 	ht_inline ht_int32_t  bspEEPROMhelp   (ht_device_t dev, ht_int8_t argc, ht_int8_t * argv[])
{
	int arg=0,i,j;
	htDevFsHandle fd;
	ht_uint8_t Rbuffer[10];
	ht_uint8_t Tbuffer[10];
	ht_uint16_t temp;
	static ht_uint8_t cnt=0;
	if(arg<=argc)
	{
		if (strcmp((char const *) argv[2], "test")==0)
		{
		ht_printk("devname %s\r\n",argv[1]);
		fd=htDevFsOpen( argv[1],0);
		if(fd!=NULL)
		{
			
			for(j=0;j<5;j++)
			{
				cnt++;
			ht_printk("Write:");
				for(i=0;i<10;i++)
			{
		  Tbuffer[i]=i+cnt;
				 	ht_printk("%02x ",Tbuffer[i]);
			}
			ht_printk("\r\n");
			if( htDevFsWrite(fd,0,Tbuffer,10)==10)
			{
				ht_printk("bspEEPROMWrite is Ok \r\n");
			}
			OSTimeDlyHMSM(0,0,0,300);
				if( htDevFsRead(fd,0,Rbuffer,10)==10)
			{
				ht_printk("bspEEPROMRead is Ok \r\n");
			}
			 	ht_printk("Read:");
			for(i=0;i<10;i++)
			{
		   	ht_printk("%02x ",Rbuffer[i]);
		 
			}
			ht_printk("\r\n");
		}
	}
      htDevFsClose(fd);	
      	
		}
		else
		{
			ht_printk("can not find dev\r\n");
		}
	}
}
           

3、實際操作II2C端口

//EEPROM讀操作
for(i=0;i<size;i++)
	{
	buf[0]=(ht_uint8_t)pos++;
	msg.pMsg=&buf[0];
	msg.Len=1;
	msg.Total=2;	
	htDevFsControl(i2cfd,CMD_I2C_WRITEREAD,(void*)&msg);
	Dat[i]=buf[1];
	
	}
//EEPROM寫操作
	for(i=0;i<NumByteToWrite;i++)
	{
	buf[0]=(ht_uint8_t)WriteAddr++;
	buf[1]=Dat[i];
	msg.pMsg=&buf[0];
	msg.Len=2;
	msg.Stop=1;	
	htDevFsControl(i2cfd,CMD_I2C_WRITE,(void*)&msg);
		OSTimeDlyHMSM(0,0,0,8);
	}
           

4、配置GI2C 硬體接口

/**********************************************************************************************************
 *
 *  函數名:GI2C1_GPIO_Config_bf
 *  功 能: 
 *  參  數:
 *  傳回值:
 *  版 本:REV1.0.0          2016/04/27    Create
 *
 **********************************************************************************************************/
 ht_inline void GI2C1_GPIO_Config_bf(void)
 {
	GPIO_InitTypeDef  GPIO_InitStructure;
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);  //使能GPIOB時鐘
  //GPIOB8,B9初始化設定
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;          //普通輸出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;         //開漏輸出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;     //100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;           //上拉
  GPIO_Init(GPIOB, &GPIO_InitStructure);                 //初始化IO
	 //ht_printk(" GI2C1_GPIO_Config_bf OK\r\n");
	 GPIO_WriteBit(GPIOB,GPIO_Pin_8,1);
	 GPIO_WriteBit(GPIOB,GPIO_Pin_9,1);
 }
  /**********************************************************************************************************
 *
 *  函數名:GI2C1_SDA_Set
 *  功 能: 
 *  參  數:
 *  傳回值:
 *  版 本:REV1.0.0          2016/04/27    Create
 *
 **********************************************************************************************************/
ht_inline void GI2C1_SDA_Set(ht_uint8_t Data) 
 {
	 GPIO_WriteBit(GPIOB,GPIO_Pin_9,Data);
 
 }
  /**********************************************************************************************************
 *
 *  函數名:GI2C1_SCL_Set
 *  功 能: 
 *  參  數:
 *  傳回值:
 *  版 本:REV1.0.0          2016/04/27    Create
 *
 **********************************************************************************************************/
ht_inline void GI2C1_SCL_Set (ht_uint8_t Data) 
 { 
	 GPIO_WriteBit(GPIOB,GPIO_Pin_8,Data);
 }
  /**********************************************************************************************************
 *
 *  函數名:GI2C1_ReadBit
 *  功 能: 
 *  參  數:
 *  傳回值:
 *  版 本:REV1.0.0          2016/04/27    Create
 *
 **********************************************************************************************************/
ht_inline ht_uint8_t GI2C1_ReadBit (void) 
{ 
	return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9);
}	

  
//配置GI2C1
const struct hcfResource gI2C1DrvResources[] ={ 
    { "I2C_Init", HT_RES_ADDR, { (void **)&GI2C1_GPIO_Config_bf } }, 
		{	"I2C_SDA_SET", HT_RES_ADDR, { (void **)&GI2C1_SDA_Set } }, 
		{	"I2C_SCL_SET", HT_RES_ADDR, { (void **)&GI2C1_SCL_Set } }, 
		{	"I2C_BIT_READ", HT_RES_ADDR, { (void **)&GI2C1_ReadBit } }, 
		{	"I2C_SPEED", HT_RES_INT,   (void **)16 }, 
  

   };
           

5、測試結果

建構驅動子產品2--STM32模拟IIC通路 (AT24C02)EEPROM 操作           建構驅動子產品2-- STM32模拟IIC通路 (AT24C02)EEPROM 操作

EPPROM讀取結果:

建構驅動子產品2--STM32模拟IIC通路 (AT24C02)EEPROM 操作           建構驅動子產品2-- STM32模拟IIC通路 (AT24C02)EEPROM 操作

繼續閱讀