ADS1110的stm32驱动程序,自带I2C驱动。
2022-01-11 14:11:05 2.21MB ADS1110 stm32 I2C1
1
STM32F103ZE I2C1调试手记近日因项目需要,使用100PIN的STM32带FSMC功能驱动3.2"TFTLCD;在使用EEPROM时发现原来的I2C程序居然无法使用,郁闷了! 先说一下我这个I2C的驱动程序是经过STM32的官方库函数整理而成,API支持全系列EEPROM以及8BIT地址的其它I2C设备,一直用的很爽。 赶紧查找问题原因,发现连STA信号都无法启动完成,一直循环在等待状态while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); 真是见鬼了,居然连STA信号都无法建立,首先怀疑是硬件问题,于是赶紧查找硬件问题,换EEPROM,无果。奇了怪了,其它项目用的好好的程序,问百度吧?百度一下,这个问题还真多啊,而且还一模一样,问题都没结果,基本的认识是说ST芯片的问题,只能用模拟总线解决。 难道真是芯片问题?这可能吗?这可是ST啊,放眼全球有几家公司能与之抗衡啊。我首先觉得不可能,理由是为什么我其它项目用的好好的,虽说不是同PIN的芯片,可是同系列啊。于是我用其它项目的程序稍做修改,只开放IIC功能把程序下载到103ZE,运行一切正常。这就验证了我的判断,芯片不可能有问题。可为什么不行呢?难道是底层库函数的问题,于是升级库函数,移植到3.0版本的,这样捣鼓一下,一上午时间就这样没了,郁闷啊郁闷到差点绝望啊!!!先吃完中午饭,准备下午再战。再问百度吧,找来找去还是没结果,都说是芯片问题。纠结,难不成真的要用模拟I2C总线解决。不甘心啊,土法炼钢吧,把所有初始化程序一个一个注释掉,下载测试,当注释掉LCD初始化程序时,奇迹出现了,I2C总线OK了,天啦难道是LCD造成的?查看LCD初始化程序,FSMC初始化程序,没发现问题啊,再加上LCD初始化程序,I2C又不能工作了,看来确实是LCD的功能造成,先把FSMC注释掉,运行I2C又OK了,终于找到你了,就是FSMC造成的,看程序没有任何错误,还是查手册吧,在手册中看到I2C1的SDA脚与FSMC_NADV脚是共用一个端口,难道是这个引起的,查看手册《STM32F101xC/D/E 和 STM32F103xC/D/E勘误表》终于发现问题的根源。原文描述:2.7.15 FSMC和 I2C1以及TIM4_CH2问题描述如果要使用FSMC功能,NADV被配置成复用输出,该信号会被默认地置位。这样就和TIM4_CH2和I2C1的SDA信号发生冲突。暂时解决办法当使用FSMC的同时,不要使用TIM4_CH2。如果要使用I2C1并且封装允许,就把该功能重映射到PB8/PB9。2.7.13 SDIO 和经过重映射的I2C1配置条件当SDIO配置成1位或者4位模式,会和被重映射到PB8/9引脚上的I2C1发生冲突。冲突发生在以下信号之间:● I2C1_SCL和SDIO_D4● I2C1_SDA和SDIO_D5暂时解决办法当使用SDIO的同时,不要重映射I2C1的功能到PB8/PB9。问题找到了,就是这个原因啊,天杀的ST,映射功能只能到PB8 PB9端口上,不能映射到任意商品上,可我的PB8 PB9端口被SDIO功能占用了。I2C2端口也被USART3功能占用了。问题是找到了,可最后结果只能模拟总线来实现了。调试结论:1. ST的芯片不会有问题。ST官方的库函数是非常好用的,用的很爽的!2. 当使用大容量芯片具有FSMC功能与I2C1功能同时使用时, 需要把I2C1映射到PB9 PB9端口上去。3. 如果要同时使用FSMC I2C1 SDIO功能时,I2C1只能用模拟总线方式实现。因为SDIO功能会占用PB8 PB9端口。以下是I2C模拟总线程序源代码
2021-08-17 18:25:45 6KB STM32F103 I2C1 STM32F
1
在本文中,我们将深入探讨如何在STM32微控制器上为ADS1110 ADC(模拟数字转换器)实现I2C驱动。ADS1110是一款高精度、低功耗的16位ADC,广泛应用于各种需要进行模拟信号到数字信号转换的系统中。STM32系列微控制器则是由意法半导体公司推出的基于ARM Cortex-M内核的微控制器,具有高性能、低功耗的特点,非常适合嵌入式应用。 I2C(Inter-Integrated Circuit)是一种多主控通信协议,用于连接微控制器和外围设备,如传感器、时钟、存储器等。在STM32中,I2C通信通常通过配置相应的GPIO引脚和初始化I2C外设来实现。在这个案例中,我们关注的是I2C1接口,它是STM32芯片上的一个I2C总线接口。 要驱动ADS1110,首先需要了解其I2C地址。ADS1110的I2C地址是0x48,可通过引脚A0、A1和A2进行选择,允许最多8个设备在同一总线上。在STM32的I2C驱动程序中,我们需要设置这个地址以便正确地与ADS1110通信。 接下来,我们需要配置STM32的I2C1外设。这包括设置时钟源、时钟频率、GPIO引脚复用模式、中断和DMA配置等。例如,SCL(时钟)和SDA(数据)引脚可能被映射到STM32的特定GPIO端口,如PB6和PB7。在初始化过程中,我们需要将这些GPIO端口配置为I2C模式,并开启内部上拉电阻。 初始化I2C1后,就可以发送读写命令了。与ADS1110通信通常涉及以下步骤: 1. 发送开始条件(START)。 2. 写入ADS1110的7位I2C地址,加上写方向位(0)。 3. 发送寄存器地址或命令字节。 4. 如果需要写入数据,发送数据字节。 5. 发送重复开始条件(ReSTART),不释放SCL线。 6. 再次发送ADS1110的7位I2C地址,加上读方向位(1)。 7. 读取数据字节,根据需要发送应答位(ACK)或非应答位(NACK)。 8. 发送停止条件(STOP)。 对于ADS1110,你可以读取和设置配置寄存器以改变其工作模式,例如选择输入通道、增益、采样速率等。它还支持连续转换和单次转换模式,可以通过写入相应的控制字节来切换。 在提供的压缩包文件中,"test.txt"可能是用于测试驱动程序的代码或日志文件,而"ADS1110 16bitADC I2C1"可能是包含实际驱动代码的文件。这个文件可能包含了实现上述I2C通信流程的具体函数,如`i2c_write()`和`i2c_read()`,以及针对ADS1110的配置和读取数据的函数。 通过STM32的I2C1接口驱动ADS1110涉及配置I2C外设、发送I2C通信命令以及解析接收到的数据。这个过程需要对STM32和I2C协议有深入的理解,同时,提供的驱动代码将提供具体的实现细节和操作步骤。在实际项目中,开发者可以基于这些代码进行修改和优化,以满足特定应用场景的需求。
2019-12-21 20:49:17 2.21MB  ADS1110 stm32 I2C1
1