STM32关于触摸芯片 BS8112A-3 BS8116A-3 I2C 源程序 及问题

news/2024/9/23 7:17:40/

最近用了一款 BS8112A-3 16NSOP 12键电容触摸按键芯片IC,调了半天没调通 ,最后发现把设备地址看错了,手册给的是7bit地址,子设备地址应该是0xA0不应该是0x50!

现上代码:

#include "stm32f0xx.h"
void I2C_INT_Init()
{GPIO_InitTypeDef        GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef  NVIC_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);//ÅäÖÃʱÖÓRCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);//ÅäÖÃʱÖÓGPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOA, &GPIO_InitStructure);EXTI_InitStructure.EXTI_Line=EXTI_Line5;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd=ENABLE;SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource5);EXTI_Init(&EXTI_InitStructure);NVIC_InitStructure.NVIC_IRQChannel=EXTI4_15_IRQn;NVIC_InitStructure.NVIC_IRQChannelPriority=2;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);	
}
void I2C_SDACL_Init(void) //I2CÒý½ÅÅäÖÃ
{GPIO_InitTypeDef        GPIO_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);//ÅäÖÃʱÖÓGPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_PinAFConfig(GPIOA,GPIO_PinSource10, GPIO_AF_4);GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_4);}void ZLG_24C_Init(void)//I2C³õʼ»¯º¯Êý
{ I2C_InitTypeDef I2C_InitStructure;I2C_INT_Init();I2C_SDACL_Init();RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK);RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);//ÅäÖÃʱÖÓRCC_APB1Periph_I2C1I2C_InitStructure.I2C_Mode=I2C_Mode_I2C;I2C_InitStructure.I2C_Ack=I2C_Ack_Enable;//I2C_InitStructure.I2C_Ack=I2C_Ack_Disable;I2C_InitStructure.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;I2C_InitStructure.I2C_DigitalFilter = 0x00;I2C_InitStructure.I2C_OwnAddress1=0x00;//I2C_InitStructure.I2C_Timing=0x30E32E44;I2C_InitStructure.I2C_Timing=0x20D22E37;I2C_InitStructure.I2C_AnalogFilter=I2C_AnalogFilter_Enable;I2C_Init(I2C1,&I2C_InitStructure);I2C_Cmd(I2C1,ENABLE);// ZLG_24C_Read(0xA0,0x08);
}
uint8_t ZLG_24C_Read(uint8_t addr1, uint8_t addr2)//¶ÁI2Cº¯Êý
{uint8_t data;uint16_t i;i=0;while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) != RESET){i++;if(i>600)  return 0;}I2C_TransferHandling(I2C1, addr1, 1, I2C_SoftEnd_Mode,I2C_Generate_Start_Write);i=0;while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET){i++;if(i>600)  return 0;}I2C_Senddata(I2C1, addr2);i=0;while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TC) == RESET){i++;if(i>600) return 0;}I2C_TransferHandling(I2C1, addr1, 1,  I2C_AutoEnd_Mode, I2C_Generate_Start_Read);i=0;while(I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE) == RESET){i++;if(i>600) return 0;}data=I2C_Receivedata(I2C1);i=0;while(I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF) == RESET){i++;if(i>600) return 0;}i=0;while(I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE) != RESET){i++;if(i>600) return 0;}return(data);
}void ZLG_24C_Write(uint8_t addr1,uint8_t addr2,uint8_t data)//дI2Cº¯Êý
{uint16_t i;while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) != RESET);I2C_TransferHandling(I2C1, addr1, 2, I2C_AutoEnd_Mode,I2C_Generate_Start_Write);i=0;while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET){i++;if(i>600) return;}I2C_Senddata(I2C1, addr2);i=0;while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET){i++;if(i>600) return;}I2C_Senddata(I2C1, data);while(I2C_GetFlagStatus(I2C1,I2C_FLAG_STOPF) == RESET);}
void EXTI4_15_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line5)!=RESET){ settableflag(Flag_getkey,0);//riar=1;}	EXTI_ClearITPendingBit(EXTI_Line5);//Çå³ýÖжϱê־λ
}




http://www.ppmy.cn/news/445712.html

相关文章

C语言循环语句中 i++, ++i, i--, --i的使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、for 循环语句1. i 和 i 的使用2. i-- 和 --i 的使用 二、while 循环语句1. i 和 i 的使用i的情况i的情况 2. i--和 --i 的使用i--的情况--i的情况 三、do..…

4、I3C协议详解

I3C最初的设计目的是为移动设备创建一个能够使用多个传感器的单一接口。随着现代化移动设备对于传感器数量的增加以及对性能的提高,I2C和SPI已经达到了他们所能支持的临界点,而I3C的出现就是为了解决这一问题,I3C可以在同一根主线上支持更多的…

i2c我们用得很多,i3c又是什么?

文章目录 1 前言2 i3c总线接口2.1 什么是i3c2.2 i3c的特点低目标电压支持软中断支持数据内命令码,错误检查支持多个主机支持热插拔支持动态地址功耗低,通信速率高支持多种通信模式 2.3 i3c 时序图起始信号停止时序数据传输时序完整时序图 2.4 i3c应用场景…

I3C简介

1、I2C的不足之处 从设备无法主动向主设备发起通讯降低吞吐量和上拉电阻限制了时钟速率且使得功耗偏高 2、SPI的不足之处 需要四根通讯线路来进行较大的数据通讯没有一个明确的定义标准 3、I3C特性 明确的定义标准两条通讯线路(DCL和SDA)带内中断带…

大数据(3i)Sqoop安装和操作

学习Sqoop前,先装好Hadoop、HIVE和MySQL 帅气的目录 1、Sqoop简介2、安装2.1、下载2.2、环境变量2.3、解压和移动2.4、配置文件(此步可略)2.5、复制 JDBC 驱动程序2.6、MySQL连接测试 3、基本操作4、ETL入门示例4.1、数据准备4.2、MySQL数据导…

Linux文件操作四剑客

目录 一、grep (一)作用 (二)格式 (三)选项 (四)案例 1、查看/etc目录下所有包含bash的文件名:grep -rl bash /etc 2、查看/var/log目录下所有包含error的文…

固态硬盘分类

看了很对固态的分类知识,记录总结一下。 一个新手看的话还是比较复杂的,因为涉及的属性比较多,但是个人觉得以表格的形式展现,逻辑会比较清晰。买硬盘首先得物理接口兼容,至少得能插在主板上吧,不然怎么用…

SSD硬盘性能测试比较

由于公司最近需要上SSD,用于 MySQL 数据库服务器,以下针对单块480G SSD、接RAID卡240G SSD* 2 RAID0,以及与普通硬盘SATA硬盘以及SAS(raid10)做个比较: 480G SSD: INTEL SSDSC2BP480G4 SATA:WD6401AALS-00J7B1 240*2 SSD RAID0: …