㈠ i2c和i2s
I2S(Inter-IC Sound Bus)是飞利浦公司颂燃为数字音频设备之间的音频 数据传输而制定的一种总线标准。
i2c(发音为:”I squared see”)能用于替代标准的并行总线,能连接的各种集成电路和功能模块。I2C是多主控总线,所以任何一个设备都能像主控器一样工作,并控制总线。总线上每一个设备都有一个独一无二的地址,根据设备它们自己的并唯能力,它们可以作为发射器或接收器工作。多路微野蔽虚控制器能在同一个I2C总线上共存。
㈡ 关于I2C程序
AT的没有具体去看他的daatsheep
一般的 24都是允许一次性全部读出的只要你的时序没有问题
另外ack信号迟一专点发送属 不会影响读写的
你可以仔细看一下 at的 daatsheep看有没有256字节的限制.
普通的24是01-128字节 02=256字节...16=2047字节..
超过部分..器件会自动回到0地址处理,
/////////////////////////////////////////////
看了一下你,后面添加的程序.
如果你这样写.那么read_all那边就不需要用参数了.
因为如果读取,一般都是从0开始读取的..
另外x24c08_read如果是单字节读写函数.而且是正确的话
那么用
for (ii=0;ii<4;ii++)
{
for (iii=0;iii<256;iii++)
{
c=x24c08_read(ii,(uchar)iii);
SBUF=c;
while (!TI);
这种方式的读取一定是没有问题.
有问题就是你的代码..或者你的eep本身坏了.
如果你感觉时许地上对的话..不妨看一下.
//////////////////////////////////
㈢ QN8027芯片的I2C通信过程
QN8027是使用于便携式设备高性能数字调频发射芯片。
为了设计一袭闭历台拍搜数字式的FM发射系统,我们首先需要了解一下这颗芯片与MCU的工作过程。
左右模拟音频信号输入后经过VGA的调整,由两个高分辨率ADC采样数字化。预加重和MPX进行编码。如果RDS寄存器使能时,RDS信号也将与MPX信号和混合,组合的输出将被馈送到一个数字FM调制器,随后将FM信号载波为RF。然后对RF信号进行滤波,并通过功率放大器放大。
其中,IC与MCU的通信态纤使用I2C通信协议来完成。
㈣ 两个51单片机如何通过i2c通讯
一般情况下,要进行I2C通讯,你最起码其中有一个芯片要本身就带有I2C通讯接口,用这个带有I2C接口的芯片来作从器件,这样就相返巧对好处理一点。你要是两个都不带这个接口,来模拟的话,很有难度。除非你对I2C协议很清楚,不过从楼主的提问来看,估计就不怎么熟悉这种协议。
所以建议还是用别的通讯方式吧,比如用SPI,相对会好处理一点,用其中一个芯片的INTx来模拟CS接口,作为从器件在中断中来处理,另外一个就模拟主器羡竖件来控制从器件,这样或许会好弄点。如果楼主确实需要通讯,还是赶快换个思路吧,要是卡在一个地方动不了,会耽误你的进程的兄世大,祝你好运!
㈤ 如何写linux的I2C驱动,更具体的是加密芯片at88sc0104c的驱动
直接在应用空间写吧,驱动的话要复杂点,会给你增加难度的。
在应用空间用/dev/i2cdev 来访问i2c 设备的例子,你直接 吧。
加密芯片的话,一般厂家都有支持代码的吧,不过不一定是linux 平台的,你把访问i2c 的那部分改改就成了。
㈥ 什么是I2C,I2C有什么作用
I²C(Inter-Integrated Circuit)是内部整合电路的称呼,是一种串行通讯总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边装置而发展。I²C(读作"I-squared-C" ),还有可选的拼写方式是I2C(读作I-two-C)以及IIC(读作I-I-C),在中国则多以"I方C"称之。
I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。I2C 总线支持任何IC 生产过程(CMOS、双极性)慎孝。通过串行数据(SDA)线和串行时钟 (SCL)线在连接到总线的器件间传递信息。每个器件都有一个唯一的地址识别(无论是微控制器——MCU、LCD 驱动器、存储器或键盘接口),而且都可以作为一个发送器或接收器(由器件的功能决定)。LCD 驱动器只能作为接收器,而存储器则既可以接收又可以发送数据。除了发送器和接收器外,器件在执行数据传输时也可以被看作是主机或从机(见表1)。主机是初始化总线的数据传输并产生允许传输的时钟信号的器件。此时,任何被寻址的器件都被认为是从机。
特征:
亩吵1、只要求两条总线线路:一条串行数据线SDA,一条串宽耐稿行时钟线SCL;
2、每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址,主机可以作为主机发送器或主机接收器;
3、它是一个真正的多主机总线,如果两个或更多主机同时初始化,数据传输可以通过冲突检测和仲裁防止数据被破坏;
4、串行的8 位双向数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s;
5、连接到相同总线的IC 数量只受到总线的最大电容400pF 限制。
㈦ I2C接口4/5/6/7/8/9/10/12/16键低功耗抗干扰触摸触控IC(芯片)-VK36N4-10/12/16I
VK36N4I/5I/6I/7I/8I/9I/10I/12I/16I对应4-10/12/16键触摸按键,可用来检测外部触摸卜此扰按键上人手的触摸动作。该芯片具有较高的集成度,仅需极少的外部组件便可实现触摸按键的检测。芯片内部采用特殊的集成电路,具有高电源电压抑制比,可减少按键检测错误的发生,此特性保证在不利环境条件的应用中芯片仍具有很高的可靠性。具有自动校准功能,低待机电流,抗电压波动等特性,为各种触摸按键+IO输出的应用提供了一种简单而又有效的实现方法。
特性: 工作电压:2.2V~5.5V&nBSP(Q361/888/5898); 低待机电流10uA/3V 低压重置(LVR)电压2.0V 4S自动校准功能 可靠的触摸按键检测 无键按下4S进入待机模式 防呆功能长按10S复位 具备抗电压波动功能 I2C输出+INT中断脚 专用管脚外接电容(1nF-47nF)调整灵敏度OPT管脚选择输出低有效还是高有效 极少的外围组件
VK36N4I/5/6/7/8/9/10I是内建LDO高灵敏度低功耗且抗干扰的触摸IC
————————————
触摸触控IC系列简介如下:标准触控IC-电池供电系列:
VKD223EB ---
工作电压/电流:2.0V-5.5V/5uA-3V 感应通道数:1 通讯接口最长响应时间快速模式60mS,低功耗模式220ms 封装:SOT23-6
VKD223B ---
工作电压/电流:2.0V-5.5V/5uA-3V 感应通道数:1 通讯接口最长响应时间快速模式60mS,低功耗模式220ms 封装:SOT23-6
VKD233DB ---
工作电压/电流:2.4V-5.5V/2.5uA-3V 1感应按键 封装:SOT23-6
通讯接口:直接输出,锁存(toggle)输出 低功耗模式电流2.5uA-3V
VKD233DH ---
工作电压/电流:2.4V-5.5V/2.5uA-3V 1感应按键 封装:SOT23-6
通讯接口:直接输出,锁存(toggle)输出 有效键最长时间检测16S
VKD233DS ---
工作电压/电流:2.4V-5.5V/2.5uA-3V 1感应按键 封装:DFN6(2*2超小封装)通讯接口:直接输出,锁存(toggle)输出 低功耗模式电流2.5uA-3V
VKD233DR ---
工作电压/电流:2.4V-5.5V/1.5uA-3V 1感应按键 封装:DFN6(2*2超小封装)通讯接口:直接输出,锁存(toggle)输出 低功耗模式电流1.5uA-3V
VKD233DG ---
工作电压/型旦电流:2.4V-5.5V/2.5uA-3V 1感应按键 封装:DFN6(2*2超小封装)通讯接口:直接输出,锁存(toggle)输出 低功耗模式电流2.5uA-3V
VKD233DQ ---
工作电压/电流:2.4V-5.5V/5uA-3V 1感应按键 封装:SOT23-6
通讯接口:直接输出,扒毁锁存(toggle)输出 低功耗模式电流5uA-3V
VKD233DM ---
工作电压/电流:2.4V-5.5V/5uA-3V 1感应按键 封装:SOT23-6 (开漏输出)通讯接口:开漏输出,锁存(toggle)输出 低功耗模式电流5uA-3V
VKD232C ---
工作电压/电流:2.4V-5.5V/2.5uA-3V
感应通道数:2 封装:SOT23-6
通讯接口:直接输出,低电平有效 固定为多键输出模式,内建稳压电路
MTP
触摸IC——VK36N系列抗电源辐射及手机干扰:
VK3601L ---
工作电压/电流:2.4V-5.5V/4UA-3V3 感应通道数:1 1对1直接输出待机电流小,抗电源及手机干扰,可通过CAP调节灵敏 封装:SOT23-6
VK36N1D ---
工作电压/电流:2.2V-5.5V/7UA-3V3 感应通道数:1 1对1直接输出触摸积水仍可操作,抗电源及手机干扰,可通过CAP调节灵敏封装:SOT23-6
VK36N2P ---
工作电压/电流:2.2V-5.5V/7UA-3V3 感应通道数:2 脉冲输出触摸积水仍可操作,抗电源及手机干扰,可通过CAP调节灵敏封装:SOT23-6
VK3602XS ---
工作电压/电流:2.4V-5.5V/60UA-3V 感应通道数:2 2对2锁存输出低功耗模式电流8uA-3V,抗电源辐射干扰,宽供电电压 封装:SOP8
VK3602K ---
工作电压/电流:2.4V-5.5V/60UA-3V 感应通道数:2
2对2直接输出低功耗模式电流8uA-3V,抗电源辐射干扰,宽供电电压 封装:SOP8
VK36N2D ---
工作电压/电流:2.2V-5.5V/7UA-3V3 感应通道数:2 1对1直接输出触摸积水仍可操作,抗电源及手机干扰,可通过CAP调节灵敏封装:SOP8
VK36N3BT ---
工作电压/电流:2.2V-5.5V/7UA-3V3 感应通道数:3 BCD码锁存输出触摸积水仍可操作,抗电源及手机干扰,可通过CAP调节灵敏 封装:SOP8
VK36N3BD ---
工作电压/电流:2.2V-5.5V/7UA-3V3 感应通道数:3 BCD码直接输出触摸积水仍可操作,抗电源及手机干扰,可通过CAP调节灵敏 封装:SOP8
VK36N3BO ---
工作电压/电流:2.2V-5.5V/7UA-3V3 感应通道数:3 BCD码开漏输出触摸积水仍可操作,抗电源及手机干扰 封装:SOP8/DFN8(超小超薄体积)
VK36N3D ---
工作电压/电流:2.2V-5.5V/7UA-3V3 感应通道数:3 1对1直接输出触摸积水仍可操作,抗电源及手机干扰 封装:SOP16/DFN16(超小超薄体积)
VK36N4B ---
工作电压/电流:2.2V-5.5V/7UA-3V3 感应通道数:4 BCD输出触摸积水仍可操作,抗电源及手机干扰 封装:SOP16/DFN16(超小超薄体积)
VK36N4I---
工作电压/电流:2.2V-5.5V/7UA-3V3 感应通道数:4 I2C输出触摸积水仍可操作,抗电源及手机干扰 封装:SOP16/DFN16(超小超薄体积)
VK36N5D ---
工作电压/电流:2.2V-5.5V/7UA-3V3 感应通道数:5
1对1直接输出触摸积水仍可操作,抗电源及手机干扰 封装:SOP16/DFN16(超小超薄体积)
VK36N5B ---
工作电压/电流:2.2V-5.5V/7UA-3V3 感应通道数:5 BCD输出触摸积水仍可操作,抗电源及手机干扰 封装:SOP16/DFN16(超小超薄体积)
VK36N5I ---
工作电压/电流:2.2V-5.5V/7UA-3V3 感应通道数:5 I2C输出触摸积水仍可操作,抗电源及手机干扰 封装:SOP16/DFN16(超小超薄体积)
VK36N6D ---
工作电压/电流:2.2V-5.5V/7UA-3V3 感应通道数:6
1对1直接输出触摸积水仍可操作,抗电源及手机干扰 封装:SOP16/DFN16(超小超薄体积)
VK36N6B ---
工作电压/电流:2.2V-5.5V/7UA-3V3 感应通道数:6 BCD输出触摸积水仍可操作,抗电源及手机干扰 封装:SOP16/DFN16(超小超薄体积)
VK36N6I ---
工作电压/电流:2.2V-5.5V/7UA-3V3 感应通道数:6 I2C输出触摸积水仍可操作,抗电源及手机干扰 封装:SOP16/DFN16(超小超薄体积)
VK36N7B ---
工作电压/电流:2.2V-5.5V/7UA-3V3 感应通道数:7 BCD输出触摸积水仍可操作,抗电源及手机干扰 封装:SOP16/DFN16(超小超薄体积)
VK36N7I ---
工作电压/电流:2.2V-5.5V/7UA-3V3 感应通道数:7 I2C输出触摸积水仍可操作,抗电源及手机干扰 封装:SOP16/DFN16(超小超薄体积)
VK36N8B ---
工作电压/电流:2.2V-5.5V/7UA-3V3 感应通道数:8 BCD输出触摸积水仍可操作,抗电源及手机干扰 封装:SOP16/DFN16(超小超薄体积)
VK36N8I ---
工作电压/电流:2.2V-5.5V/7UA-3V3 感应通道数:8 I2C输出触摸积水仍可操作,抗电源及手机干扰 封装:SOP16/DFN16(超小超薄体积)
VK36N9I ---
工作电压/电流:2.2V-5.5V/7UA-3V3 感应通道数:9 I2C输出触摸积水仍可操作,抗电源及手机干扰 封装:SOP16/DFN16(超小超薄体积)
VK36N10I ---
工作电压/电流:2.2V-5.5V/7UA-3V3 感应通道数:10 I2C输出触摸积水仍可操作,抗电源及手机干扰 封装:SOP16/DFN16(超小超薄体积)
1-8
点高灵敏度液体水位检测IC——VK36W系列
VK36W1D ---
工作电压/电流:2.2V-5.5V/10UA-3V3 1对1直接输出 水位检测通道:1
可用于不同壁厚和不同水质水位检测,抗电源/手机干扰封装:SOT23-6
备注:1. 开漏输出低电平有效 2、适合需要抗干扰性好的产品应用
VK36W2D ---
工作电压/电流:2.2V-5.5V/10UA-3V3 1对1直接输出 水位检测通道:2
可用于不同壁厚和不同水质水位检测,抗电源/手机干扰封装:SOP8
备注:1. 1对1直接输出 2、输出模式/输出电平可通过IO选择
VK36W4D ---
工作电压/电流:2.2V-5.5V/10UA-3V3 1对1直接输出 水位检测通道:4
可用于不同壁厚和不同水质水位检测,抗电源/手机干扰封装:SOP16/DFN16
备注:1. 1对1直接输出 2、输出模式/输出电平可通过IO选择
VK36W6D ---
工作电压/电流:2.2V-5.5V/10UA-3V3 1对1直接输出 水位检测通道:6
可用于不同壁厚和不同水质水位检测,抗电源/手机干扰封装:SOP16/DFN16
备注:1. 1对1直接输出 2、输出模式/输出电平可通过IO选择
VK36W8I ---
工作电压/电流:2.2V-5.5V/10UA-3V3 I2C输出 水位检测通道:8
可用于不同壁厚和不同水质水位检测,抗电源/手机干扰封装:SOP16/DFN16
备注:1. IIC+INT输出 2、输出模式/输出电平可通过IO选择
——————————————————————————
LCD/LED
液晶控制器及驱动器系列芯片简介如下:
RAM
映射LCD控制器和驱动器系列:
VK1024B 2.4V
~5.2V
6seg*4com 6*3 6*2
偏置电压1/2 1/3 S0P-16
VK1056B 2.4V
~5.2V 14seg*4com
14*3 14*2 偏置电压1/2 1/3 SOP-24/SSOP-24
VK1072B 2.4V
~5.2V 18seg*4com
18*3 18*2 偏置电压1/2 1/3 SOP-28
VK1072C 2.4V
~5.2V 18seg*4com 18*3 18*2
偏置电压1/21/3 SOP-28
VK1088B 2.4V
~5.2V 22seg*4com 22*3
偏置电压1/2 1/3 QFN-32L(4MM*4MM)
VK0192 2.4V
~5.2V 24seg*8com
偏置电压1/4 LQFP-44
VK0256 2.4V
~5.2V 32seg*8com
偏置电压1/4 QFP-64
VK0256B 2.4V
~5.2V 32seg*8com
偏置电压1/4 LQFP-64
VK0256C 2.4V
~5.2V 32seg*8com
偏置电压1/4 LQFP-52
VK1621 2.4V
~5.2V 32*4 32*3 32*2 偏置电压1/2 1/3 LQFP44/48/SSOP48/SKY28/DICE裸片
VK1622 2.7V
~5.5V 32seg*8com
偏置电压1/4
LQFP44/48/52/64/QFP64/DICE裸片
VK1623 2.4V
~5.2V 48seg*8com
偏置电压1/4
LQFP-100/QFP-100/DICE裸片
VK1625 2.4V
~5.2V 64seg*8com
偏置电压1/4 LQFP-100/QFP-100/DICE
VK1626 2.4V
~5.2V 48seg*16com
偏置电压1/5 LQFP-100/QFP-100/DICE
(
高品质 高性价比:液晶显示驱动IC 原厂直销 工程技术支持!)
高抗干扰LCD液晶控制器及驱动系列:
VK2C21A 2.4
~5.5V 20seg*4com 16*8
偏置电压1/3 1/4 I2C通讯接口SOP-28
VK2C21B 2.4
~5.5V 16seg*4com 12*8
偏置电压1/3 1/4 I2C通讯接口SOP-24
VK2C21C 2.4
~5.5V 12seg*4com 8*8
偏置电压1/3 1/4 I2C通讯接口SOP-20
VK2C21D 2.4
~5.5V 8seg*4com
4*8 偏置电压1/3 1/4 I2C通讯接口SOP-16
VK2C22A 2.4
~5.5V 44seg*4com
偏置电压1/2
1/3 I2C通讯接口LQFP-52
VK2C22B 2.4
~5.5V 40seg*4com
偏置电压1/2 1/3 I2C通讯接口LQFP-48
VK2C23A 2.4
~5.5V 56seg*4com 52*8
偏置电压1/3 1/4 I2C通讯接口LQFP-64
VK2C23B 2.4
~5.5V 36seg*8com
偏置电压1/31/4 I2C通讯接口LQFP-48
VK2C24 2.4
~5.5V 72seg*4com 68*8
60*16 偏置电压1/3 1/4 1/5 I2C通讯接口LQFP-80
[if !supportLineBreakNewLine]
[endif]
超低功耗LCD液晶控制器及驱动系列:
VKL060 2.5
~5.5V 15seg*4com
偏置电压1/2
1/3 I2C通讯接口SSOP-24
VKL128 2.5
~5.5V 32seg*4com
偏置电压1/2
1/3 I2C通讯接口LQFP-44
VKL144A 2.5
~5.5V 36seg*4com
偏置电压1/2 1/3 I2C通讯接口TSSOP-48
VKL144B 2.5
~5.5V 36seg*4com
偏置电压1/2 1/3 I2C通讯接口QFN48L (6MM*6MM)
静态显示LCD液晶控制器及驱动系列:
VKS118 2.4
~5.2V 118seg*2com
偏置电压 --
4线通讯接口LQFP-128
VKS232 2.4
~5.2V 116seg*2com
偏置电压1/1 1/2 4线通讯接口LQFP-128
永嘉微电/VINKA,工程服务技术支持,主营LCD/LED驱动IC/触摸IC
____________________________________________________________________
内存映射的LED控制器及驱动器:
VK1628 ---
通讯接口:STB/CLK/DIO 电源电压:5V(4.5~5.5V) 驱动点阵:70/52 共阴驱动:10段7位/13段4位 共阳驱动:7段10位 按键:10x2 封装SOP28
VK1629 ---
通讯接口:STB/CLK/DIN/DOUT 电源电压:5V(4.5~5.5V) 驱动点阵:128共阴驱动:16段8位 共阳驱动:8段16位 按键:8x4 封装QFP44
VK1629A ---
通讯接口:STB/CLK/DIO 电源电压:5V(4.5~5.5V) 驱动点阵:128共阴驱动:16段8位 共阳驱动:8段16位 按键:--- 封装SOP32
VK1629B ---
通讯接口:STB/CLK/DIO 电源电压:5V(4.5~5.5V) 驱动点阵:112 共阴驱动:14段8位 共阳驱动:8段14位 按键:8x2 封装SOP32
VK1629C ---
通讯接口:STB/CLK/DIO 电源电压:5V(4.5~5.5V) 驱动点阵:120 共阴驱动:15段8位 共阳驱动:8段15位 按键:8x1 封装SOP32
VK1629D ---
通讯接口:STB/CLK/DIO 电源电压:5V(4.5~5.5V) 驱动点阵:96 共阴驱动:12段8位 共阳驱动:8段12位 按键:8x4 封装SOP32
VK1640 ---
通讯接口: CLK/DIN 电源电压:5V(4.5~5.5V) 驱动点阵:128共阴驱动:8段16位 共阳驱动:16段8位 按键:--- 封装SOP28
VK1650 ---
通讯接口: SCL/SDA 电源电压:5V(3.0~5.5V) 驱动点阵:8x16共阴驱动:8段4位 共阳驱动:4段8位 按键:7x4 封装SOP16/DIP16
VK1668 ---
通讯接口:STB/CLK/DIO 电源电压:5V(4.5~5.5V) 驱动点阵:70/52共阴驱动:10段7位/13段4位 共阳驱动:7段10位 按键:10x2 封装SOP24
VK6932 ---
通讯接口:STB/CLK/DIN 电源电压:5V(4.5~5.5V) 驱动点阵:128共阴驱动:8段16位17.5/140mA 共阳驱动:16段8位 按键:--- 封装SOP32
VK16K33 ---
通讯接口:SCL/SDA 电源电压:5V(4.5V~5.5V) 驱动点阵:128/96/64 共阴驱动:16段8位/12段8位/8段8位 共阳驱动:8段16位/8段12位/8段8位按键:13x3 10x3 8x3 封装SOP20/SOP24/SOP28
㈧ 谁有触控芯片BS8112A控制代码
转来的
#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)
{
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_InitTypeDef I2C_InitStructure;
I2C_INT_Init();
I2C_SDACL_Init();
RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
I2C_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)
{
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)
{
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);
}
㈨ AT89s51模拟I2C主从机问题代码,求高手帮助
从机的代码没派丛纳有那么尘没简单的,从机要时刻监视SDA与SCL上的电平,还要判断电平变化时的时间间隔。
你可以先郑氏把主机的代码调好,再来调从机的代码。
调主机时,可以用24C01这些类似的芯片作为从机来调试。
㈩ 求解51单片机I2C对24c02读写汇编程序
ORG 0000H
LJMP MAIN
SCL BIT P2.1
SDA BIT P2.0
TEMP EQU 30H
BYTE_ADDR EQU 31H
;---------------I2C通讯程序----------------
;------------------------------------------
;---------------读取I2C数据----------------
;读取一个字节
;输入:BYTE_ADDR,读取字节地址
;输出:A
;------------------------------------------
I2CREAD:
LCALL I2C_START ;起始
MOV A,#0A0H
LCALL I2C_TXBYTE ;发送芯片地址数据+写信号
LCALL I2C_RXACK ;接收ACK
MOV A,BYTE_ADDR
LCALL I2C_TXBYTE ;发送RAM地址数据
LCALL I2C_RXACK ;接收ACK
LCALL I2C_START ;起始
MOV A,#0A1H
LCALL I2C_TXBYTE ;发送地址数据+读信号
LCALL I2C_RXACK ;接收ACK
LCALL I2C_RXBYTE ;接收数据
SETB C ;读一个字节C=1
LCALL I2C_TXACK ;发送NAK
LCALL I2C_STOP ;读取完成
RET
;----------------------------
;R4=读出字节数
;BYTE_ADDR=读出初始地址
;R1=数据指针
;----------------------------
I2C_PAGE_RD:
LCALL I2C_START ;起始
MOV A,#0A0H
LCALL I2C_TXBYTE ;发送芯片地址数据+写信号
LCALL I2C_RXACK ;接收ACK
MOV A,BYTE_ADDR
LCALL I2C_TXBYTE ;发送RAM地址数据
LCALL I2C_RXACK ;接收ACK
LCALL I2C_START ;起始
MOV A,#0A1H
LCALL I2C_TXBYTE ;发送地址数据+读信号
LCALL I2C_RXACK ;接收ACK
NXT_BYTE:
LCALL I2C_RXBYTE ;接收数据
MOV @R1,A
INC R1
CLR C ;连续读C=0
LCALL I2C_TXACK ;发送NAK
LCALL I2C_DELAY
DJNZ R4,NXT_BYTE
LCALL I2C_NOACK ;NOACK
LCALL I2C_STOP ;读取完成
RET
;----------------写一字节I2C数据------------
;写入一个字节
;输入:BYTE_ADDR,写入字节地址;A=写入数据
;输出:无
;------------------------------------------
I2CWRITE:
PUSH ACC
LCALL I2C_START ;开始写
MOV A,#0A0H
LCALL I2C_TXBYTE ;发送地址数据+写信号
LCALL I2C_RXACK ;接收ACK
MOV A,BYTE_ADDR
LCALL I2C_TXBYTE ;发送RAM地址数据
LCALL I2C_RXACK ;接收ACK
POP ACC
LCALL I2C_TXBYTE ;写数据
LCALL I2C_RXACK ;接收ACK
LCALL I2C_STOP ;写完成
LCALL I2C_DLYMS ;延时1ms
RET
;----------------------------
;R4=写入字节数
;BYTE_ADDR=写入初始地址
;R1=数据指针
;----------------------------
I2C_PAGE_WR:
LCALL I2C_START ;开始写
MOV A,#0A0H
LCALL I2C_TXBYTE ;发送地址数据+写信号
LCALL I2C_RXACK ;接收ACK
MOV A,BYTE_ADDR
LCALL I2C_TXBYTE ;发送RAM地址数据
LCALL I2C_RXACK ;接收ACK
NEXT_DATA: ;WRITE 16 BYTES TO
MOV A,@R1 ;EEPROM
LCALL I2C_TXBYTE ;写数据
LCALL I2C_RXACK ;接收ACK
INC R1
DJNZ R4,NEXT_DATA
LCALL I2C_STOP ;写完成
LCALL I2C_DLYMS ;延时1ms
RET
;----------------------------
;发送I2C起始信号
;----------------------------
I2C_START:
SETB SCL ;时钟高电平时数据下降沿为启动信号
LCALL I2C_DELAY
SETB SDA
LCALL I2C_DELAY
CLR SDA ;数据线下降沿
LCALL I2C_DELAY ;延时
CLR SCL ;时钟->低
LCALL I2C_DELAY ;延时
RET
;----------------------------
;发送I2C停止信号
;----------------------------
I2C_STOP:
CLR SDA
LCALL I2C_DELAY ;延时
SETB SCL ;时钟->高
LCALL I2C_DELAY ;延时
SETB SDA ;数据线上升沿
LCALL I2C_DELAY ;延时
CLR SCL
RET
;----------------------------
;发送ACK/NAK信号
;----------------------------
I2C_TXACK:
MOV SDA,C ;送ACK数据
LCALL I2C_DELAY ;延时
SETB SCL ;时钟->高
LCALL I2C_DELAY ;延时
CLR SCL ;时钟->低
LCALL I2C_DELAY ;延时
SETB SDA ;发送完成
RET
;----------------------------
;接收ACK/NAK信号
;----------------------------
I2C_RXACK:
SETB SDA ;准备读数据
LCALL I2C_DELAY ;延时
SETB SCL ;时钟->高
LCALL I2C_DELAY ;延时
MOV C,SDA ;读取ACK信号
CLR SCL ;时钟->低
LCALL I2C_DELAY ;延时
RET
;----------------------------
I2C_NOACK:
SETB SDA ;NO ACKNOWLEDGE
LCALL I2C_DELAY
SETB SCL
LCALL I2C_DELAY
CLR SCL
LCALL I2C_DELAY
RET
;----------------------------
;发送一字节数据
;----------------------------
I2C_TXBYTE:
MOV R7,#8 ;8位计数
TXNEXT:
RLC A ;移出数据位
MOV SDA,C ;数据送数据口
SETB SCL ;时钟->高
LCALL I2C_DELAY ;延时
CLR SCL ;时钟->低
LCALL I2C_DELAY ;延时
DJNZ R7,TXNEXT ;送下一位
RET
;----------------------------
;接收一字节数据
;----------------------------
I2C_RXBYTE:
MOV R7,#8 ;8位计数
RXNEXT:
SETB SCL ;时钟->高
LCALL I2C_DELAY ;延时
MOV C,SDA
RLC A
CLR SCL ;时钟->低
LCALL I2C_DELAY ;延时
DJNZ R7,RXNEXT ;收下一位
RET
;----------------------------
I2C_DELAY: ;
NOP
NOP
RET ;
;----------------------------
I2C_DLYMS:
PUSH 0
PUSH 1
MOV R1,#2
I2CDL:
MOV R0,#248
DJNZ R0,$
DJNZ R1,I2CDL
POP 1
POP 0
RET
;----------------------------
MAIN:
MOV SP,#60H
MOV A,#0AAH
MOV BYTE_ADDR,#0
LCALL I2CWRITE
LCALL I2CREAD
MOV P1,A
SJMP $
END
;----------------------------