国产W806 I2C硬件模块

根据PDF资料描述,没有想到还是翻车了,改芯片PDF描述简直精简的需要靠猜测来编程,翻看官方提供的I2C都是软件模拟发送(至少我没有找到硬件的),也许软件模拟的I2C更有灵魂!

先看最终效果,这里我读取的是LTC4151 模块

虽然经过计算400KHz的时钟,但是逻辑分析仪读出始终偏小;


//#define I2C_BASE	(HR_APB_BASE_ADDR + 0x0000)
//
//typedef struct
//{
//	__IOM uint32_t PRESCALE_L;
//	__IOM uint32_t PRESCALE_H;//4
//	__IOM uint32_t CTR;//8
//	__IOM uint32_t TXR_RXR;//c
//	__IOM uint32_t CR_SR;//10
//	__IM  uint32_t TXR;
//	__IM  uint32_t CR;
//} I2C_TypeDef;

#define	i2cReg  	((I2C_TypeDef*)I2C_BASE)
void Soc_i2cInit(void)
{
	__HAL_RCC_I2C_CLK_ENABLE();
	__HAL_AFIO_REMAP_I2C_SCL(GPIOA,GPIO_PIN_1);
	__HAL_AFIO_REMAP_I2C_SDA(GPIOA,GPIO_PIN_4);

	uint32_t i2cClk =400;//设置时钟:400Khz
	uint32_t prescale=(40*1000)/(5*i2cClk)-1 ;//= 16’d19
	i2cReg->PRESCALE_L =prescale&0xff;
	i2cReg->PRESCALE_H =(prescale>>8)&0xff;
	i2cReg->CTR =(1UL<<7);//使能i2c
}

#define		I2C_Stop(){i2cReg->CR_SR=(1UL<<6);}
//向I2c 写入一个字节
//uint8_t haddr,硬件地址
//uint8_t cmd,软件地址,16bit需要修改
//uint8_t data,写入数据
//return 不等于0 失败
int I2C_Write_Byte(uint8_t haddr,uint8_t cmd,uint8_t data )
{
	int err =-1;
	uint8_t datas[3] ={haddr&0xfe,cmd,data};
	uint8_t start =(1UL<<7);
	for(int i=0;i<3;i++){
		i2cReg->TXR_RXR =datas[i];
		i2cReg->CR_SR=(1UL<<4)|(1UL<<0)|start;//写入开始、清空中断
		start=0;
		while((i2cReg->CR_SR&(1UL<<0))==0){;}//等待完成
		if((i2cReg->CR_SR&(1UL<<7))!=0){//判断设备响应
			goto exit;
		}	
	}
	err =0;
exit:
	I2C_Stop();//发送停止
return err;
}
//i2C连续读取寄存器
//uint8_t haddr :硬件地址
//uint8_t cmd:软件地址,8位,16bit需要修改
//uint8_t *data:接收地址
//int blen:读取字节数
//return 不等于0 失败
int I2C_Read_Byte(uint8_t haddr ,uint8_t cmd,uint8_t *data,int blen)
{
	int err =-1;
	uint8_t datas[3] ={haddr&0xfe,cmd,haddr|1};
	uint8_t start =0;
	for(int i=0;i<3;i++){
		i2cReg->TXR_RXR =datas[i];//装载数据
		start=(i==1)?0:(1UL<<7);//硬件地址需要发送开始
		i2cReg->CR_SR=(1UL<<4)|(1UL<<0)|start;//写入开始、清空中断
		while((i2cReg->CR_SR&(1UL<<0))==0){;}//等待完成
		if((i2cReg->CR_SR&(1UL<<7))!=0){//判断设备响应
			goto exit;
		}	
	}
	start=0;
	while(blen--){
		if(blen==0){
			start=(1UL<<3);//NACK
		}
		i2cReg->CR_SR=(1UL<<5)|(1UL<<0)|start;//读取+开始,清空中断
		while((i2cReg->CR_SR&(1UL<<0))==0){;}//等待完成
		*data++ =i2cReg->TXR_RXR;//接收数据
	}
	err =0;
exit:
	I2C_Stop();//发送停止
return err;
}

int main(void)
{
    uint8_t data[16];x
    Soc_i2cInit();
    do{
    int ret =I2C_Read_Byte(0xde,0,data,8);
    }while(0);
return 0;
}

w806工具* 保持原来的 智能一键封装工具V4.0-完美版 的所有功能,在此基础上修正了大量的错误,并且添加了最新 的一些元素,也许没有完美 ,但是我们尽力做得更加完美!       *智能一键封装工具v4.0 - 微软版  更新大量SP3的电源文件,能自动识别2000 2003 xp,SP2和SP3系列文件、更能       *最完美的支持2000 2003 xp,,SP2和SP3封装!       1、一键快速封装       2、部署接口设置(支持 无限的部署接口、支持 删除驱动包文件夹)       3、DIYOEM设置(喜欢个人信息的朋友不防简单设置一下)       4、IP设置及系统减肥(快速添加了 关闭系统还原!但也可以用手动来执行!)       5、智能驱动解压(这个驱动工具能支持格式: 7z\rar\exe\com\bat\cmd\ 、并能自动判断 显卡 和 声卡!) 最主要的是 全可以自定义LOGO图的!还集成最新 Dllcache实用工具V2.0 也可以自定义标题 和LOGO图!       右键增加了加载外部辅助工具:减肥,注册表优化,并发连接数修改,保存输入法设置等等功能应 有尽有。     ※ 相对于原来的 智能一键封装工具V4.0完美版本更新: *.本工具 支持 JM驱动 2.2  采用天空的 SRS 2.6 *.可以支持 不同的 分辨率! *.自定义 标题!首次进入 支持 REG 的导入! *.保持和原微软版界面相同! *.支持 无限的部署接口!          1、更新海量的 SRS 驱动程序和注册表。       2、智能驱动程序判断模式,智能释放并安装驱动。       3、在不同的安装时间,添加了更多的程序调用接口。       4、驱动解压:支持了更多的驱动包格式,并且支持压缩比最大的7zip格式,视频教程就是以自由 的风收集整理的驱动为范例制作的。       5、清理多余的驱动服务更迅速可靠。       6、能够清理更多的流行病毒。     集合了封装时所需要做到的每一个步骤,全智能封装,让你一键轻松搞定一切。               7、更多功能及详细使用请观看语音视频封装教程。    ★鸣谢:冰☆夕 封装内部工具—【Dllcache实用工具V2.0_注册表编辑工具】             ★智能一键封装工具 v 4.0 微软版 ★友情提醒:不支持部分精减版系统做母盘封装,删除硬件驱动建议手工删除!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值