IIC

鉴于好多人问,分享个24C64的HAL库文件和使用操作(利用硬件库iic)

文件名:24C64_OPT.c


#include "24C64_OPT.h"
/* Maximum Timeout values for flags and events waiting loops. These timeouts are
not based on accurate values, they just guarantee that the application will
not remain stuck if the I2C communication is corrupted.
You may modify these timeout values depending on CPU frequency and application
conditions (interrupts routines ...). */
#define I2C_Open_FLAG_TIMEOUT ((uint32_t)0x1000)
#define I2C_Open_LONG_TIMEOUT ((uint32_t)0xffff)

__IO uint32_t I2CTimeout = I2C_Open_FLAG_TIMEOUT;


/*******************************************************************************
* Function Name : I2C_24C64_Read
* Description :
* Input :
* Output :
* Return :
* Attention : None
*******************************************************************************/
void I2C_24C64_Read(I2C_HandleTypeDef [i]I2Cx,uint8_t I2C_Addr,uint16_t addr,uint8_t [/i]buf,uint16_t num)
{
while(HAL_I2C_Mem_Read (I2Cx ,I2C_Addr,addr,I2C_MEMADD_SIZE_16BIT,buf,num,I2CTimeout) != HAL_OK ){};
}
/*******************************************************************************
* Function Name : I2C_24C64_WriteOneByte
* Description :
* Input :
* Output : None
* Return :
* Attention : None
*******************************************************************************/
void I2C_24C64_WriteOneByte(I2C_HandleTypeDef *I2Cx,uint8_t I2C_Addr,uint16_t addr,uint8_t value)
{
while( HAL_I2C_Mem_Write(I2Cx, I2C_Addr, addr, I2C_MEMADD_SIZE_16BIT, &value, 0x01, I2CTimeout) != HAL_OK ){};
}
/*******************************************************************************
* Function Name : I2C_24C64_Write
* Description :
* Input :
* Output : None
* Return :
* Attention : None
*******************************************************************************/
void I2C_24C64_Write(I2C_HandleTypeDef [i]I2Cx,uint8_t I2C_Addr,uint16_t addr,uint8_t [/i]buf,uint16_t num)
{
while(num--)
{
I2C_24C64_WriteOneByte(I2Cx, I2C_Addr,addr++,*buf++);
}
}

/**
* @}
*/

/**
* @}
*/

/*******************[i][i][b][/i] (C) COPYRIGHT STMicroelectronics [/b][b][i]END OF FILE[/b][/i][/i]/



文件名:24C64_OPT.h


/[i] Define to prevent recursive inclusion -------------------------------------[/i]/
#ifndef __24C64_OPT_H
#define __24C64_OPT_H
#ifdef __cplusplus
extern "C" {
#endif
#include "stm32f4xx_hal.h"

#define ADDR_24LC64 0xA0
#define I2C_PAGESIZE 4


void I2C_24C64_Read(I2C_HandleTypeDef [i]I2Cx,uint8_t I2C_Addr,uint16_t addr,uint8_t [/i]buf,uint16_t num);
void I2C_24C64_Write(I2C_HandleTypeDef [i]I2Cx,uint8_t I2C_Addr,uint16_t addr,uint8_t [/i]buf,uint16_t num);

#ifdef __cplusplus
}
#endif
#endif /[i] __24C64_OPT_H [/i]/

/**
* @}
*/

/**
* @}
*/

/*******************[i][i][b][/i] (C) COPYRIGHT STMicroelectronics [/b][b][i]END OF FILE[/b][/i][/i]/


应用的时候调用H文件即可.
例如:


uint8_t WriteBuffer = {
0x00 , //modewheel.mul
0x00 , 0x00 , //modewheel.div
0x12 , //低6位有效
//6:modehome.maxspeed_enable
//5: modesoftlimit.logic_Negative_enable
//4:modesoftlimit.immediately_stop
//3:modesoftlimit.switch_enable
//2:modehome.forward_enable
//1:modespeed.s_enable
0x0A , 0x00 , 0x00 , 0x00 , //modespeed.initial
0x20 , 0x03 , 0x00 , 0x00 , //modespeed.max
0xF4 , 0x01 , 0x00 , 0x00 , //modespeed.up_time
0xF4 , 0x01 , 0x00 , 0x00 , //modespeed.down_time
0xF4 , 0x01 , 0x00 , 0x00 , //modespeed.s_range
0x00 , 0x00 , 0x00 , 0x00 , //modesoftlimit.negative_limit
0x00 , 0x00 , 0x00 , 0x00 , //modesoftlimit.positive_limit

};

for(uint8_t i=0;i<4;i++)
{
I2C_24C64_Write(I2Cx,I2C_Addr,32[i]i,(uint8_t [/i])WriteBuffer,32 );
}

上述将定义的数据依次写入iic
读的时候用


uint8_t WriteBuffer;
I2C_24C64_Read(I2Cx,I2C_Addr,32[i]i,(uint8_t [/i])WriteBuffer,32 );


好了,具体的请看另外一个贴,里面有详细的的24C02操作
这个就是基于那个修改来的..........
已邀请:

【福清】Paderboy

赞同来自:

多谢楼主分享。。

hsh506

赞同来自:

谢谢!无私奉献!

熊来了 - 90后包工头

赞同来自:

谢谢!

廿柒画生

赞同来自:

blob.png类似于这样的格式错误好多,网盘里也没有找到程序,能否发我邮箱227260313@qq.com

谢谢!

admin

赞同来自: 廿柒画生

既然被顶上来了,那么就在这里记录24C16和其他芯片的区别吧

B45A1F896BBED1E77360D7219E27FDB6.png

廿柒画生

赞同来自:

你好  ,我是用的网盘里面的hal硬件IIC blob.png

现象:读取的数据都是为0xff,

疑问:往器件写入的设备地址不应该是0xA1嘛?

admin

赞同来自: 廿柒画生 jin1419c3

@廿柒画生

函数里已经做了处理了.

blob.png

rocky

赞同来自:

小帅o同学

赞同来自:

网盘没找到程序?能否发一份到1325096511@qq.com,万分感谢


大博哥 - 90后,嵌入式软硬件

赞同来自:

 楼主你好,我现在用cubemx生成的hal_i2c_mem_read函数,发设备地址0x6b,寄存器地址0x01。用示波器发现,发设备地址的时候函数把最低位置0了,也就是改为了写的逻辑电平,我把他改回来发出0x6b的波形后,无法产生0x01的波形,请问你产生的波形是什么样子,谢谢!我的邮箱是768839134@qq.com" style="box-sizing: border-box; background: 0px 0px; color: rgb(21, 95, 170); text-decoration-line: none; cursor: pointer;">768839134@qq.com,方便的话是否可以分享一下你成功的代码 


我使用的英飞凌的A2B6芯片,要读取他的指定寄存器需要发送如下波形,我用STM32的硬件I2C发不出这个波形,因为发送设备地址的时候的第八位发送的1,也就是read command,导致无法将register address发送出去,请问你用STM32的I2C能发出相同的波形吗,谢谢。

QQ图片20190116215051.jpg

ncyaoyi

赞同来自:

感谢楼主分享

要回复问题请先登录注册