历史上的今天
返回首页

历史上的今天

今天是:2025年03月11日(星期二)

正在发生

2019年03月11日 | IIC_Recv如何在IIC静默模式下读取IIC总线数据

2019-03-11 来源:eefocus

//IIC静默模式介绍:做电容式触摸屏的原车屏升级时,需要全程读取IIC的触摸数据,且不能影响IIC总线的数据,如:不能主动查询IIC、不能发送数据、不能发送ACK信号,不能进行地址过滤、不能响应查询信号等。


//IIC静默模式实现难度比较高,需要实时同步IIC_SCL信号,识别IIC_SDA的关键信号start、stop、ack、nack、data域,需要比较精准的延时函数及健壮的代码。


//以下提供的源码即可实现IIC静默模式及IIC主模式读取数据,并转发到串口。

/****************************Copyright (c)*********************************************                                     

**--------------文件信息--------------------------------------------------------------

** 文 件 名: IIC_Recv.c

** 创 建 人: WEN (wenshijian4@163.com,QQ214490357) 

** 创建日期: 2016年2月16日

** 描    述: IIC靜默模式下,接收所有IIC數據,并轉發到串口

**---------- 版本信息------------------------------------------------------------------

** 版    本: V2.92

** 说    明: 支持8MHZ以上的系統時鐘,爲了準全讀取IIC,建議設置爲32MHZ;需要硬件SCL,SDA,INT

**-------------------------------------------------------------------------------------

**************************************************************************************/

//#ifndef u8

//#define u8 unsigned char

//#endif

/****************************************************************************************

//請根據以下4個步驟,在程序對應位置修改IO口的配置以及中斷!!



//1.在頭文件中,定義SCL,SDA,INT

#define PA4_SDA       GPIO_Pin_4  

#define PA5_INT       GPIO_Pin_5  

#define PA6_SCL       GPIO_Pin_6 

//---以下三個宏定義需要根據不同的硬件來修改,但是名字不能修改

#define Read_SDAGPIO_ReadInputDataBit(GPIOA, PA4_SDA)

#define Read_INTGPIO_ReadInputDataBit(GPIOA, PA5_INT)

#define Read_SCLGPIO_ReadInputDataBit(GPIOA, PA6_SCL)



//---注意:Read_SDA、Read_INT、Read_SCL爲關鍵字,不能改變,否則出錯!!!!





//2.三個引脚都必須定義,根據硬件修改

GPIO_InitStructure.GPIO_Pin = PA5_INT;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = PA6_SCL|PA4_SDA;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;

GPIO_Init(GPIOA, &GPIO_InitStructure);



//3.必須使能INT中斷,上下邊沿 ,根據硬件修改



GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5); 

EXTI_ClearITPendingBit(EXTI_Line5);

EXTI_InitStructure.EXTI_Line = EXTI_Line5;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;

EXTI_InitStructure.EXTI_LineCmd =ENABLE;

EXTI_Init(&EXTI_InitStructure);



//4.開啓中斷,根據硬件修改



NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0; 

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

****************************************************************************************/

#include "app_cfg.h"//包含Read_SCL,Read_SDA,Read_INT的定義





/****************************************************************************************

** 函数名称: IIC_ReadSilent

** 功能描述: 在静默模式下读取IIC数据,不响应数据不干扰IIC总线

** 参    数: *IIC_Recv :指向用于接收IIC数据的数组,

** 返 回 值: 接收到的数据长度(以字节为单位)       

** 日   期: 2015年4月17日

**---------------------------------------------------------------------------------------

** 調用方式: IIC_DataLens=IIC_ReadSilent(IIC_Recv);

** 説    明: 爲了防止意外,該數組長度應該>50BYTE 例如://unsigned char IIC_Recv[60];

**--------------------------------------------------------------------------------------

****************************************************************************************/

u16 IIC_ReadSilent(u8 *IIC_Recv);





/****************************************************************************************

** 函数名称: IIC_MasterRead

** 功能描述: 读取IIC数据,并返回数据长度及数据内容

** 参    数: *IIC_Recv :指向用于接收IIC数据的数组,

** 返 回 值: 接收到的数据长度(以字节为单位)       

** 日   期: 2015年4月17日

**---------------------------------------------------------------------------------------

** 調用方式: IIC_DataLens=IIC_MasterRead(IIC_Recv);

** 説    明: 爲了防止意外,該數組長度應該>50BYTE 例如://unsigned char IIC_Recv[60];

**--------------------------------------------------------------------------------------

****************************************************************************************/

u8 IIC_MasterRead(u8 *IIC_Recv);





/****************************************************************************************

** 函数名称: IIC_WriteEnd

** 功能描述: 读取IIC数据,并返回数据长度及数据内容

** 参    数: 

** 返 回 值: 1:成功;0:失败     

** 日   期: 2015年4月17日

**---------------------------------------------------------------------------------------

** 調用方式: 

** 説    明: 

**--------------------------------------------------------------------------------------

****************************************************************************************/

u8 IIC_WriteEnd();







/////////////////////////////////////////////////////////////////////////////////////////

/****************************************************************************************

//代碼調用過程 實例


if(ScreenMode==0)

IIC_Lens=IIC_ReadSilent(IIC_Recv);//原车屏模式,采用静音模式只读IIC数据,不响应数据、不发ACK,不干扰IIC


}



//

****************************************************************************************/



//--------------------------------------------------------------------------------------

//--------------------------------------------------------------------------------------

/*---------------------------------以下数据是根据IIC静音模式读出的数据--------------------------------------------

------------------------------------------IIC分析仪 IIC静音模式---------------------------------------

IIC数据定义:



B8:物理地址+写

B9:物理地址+读



B8 20 B9 X1 Y1 X2 Y2 00 00 00 00

|  |  |  |第二触摸点Y坐标

|  |  |第二触摸点X坐标

|  |第一触摸点Y坐标

|第一触摸点X坐标



1.每次触摸最少三个数据,与触摸屏接触时间越长,则发出的数据越多;

2.触摸弹起:坐标全为0;

3.各类手势:发出手势经过的X,Y坐标点;

4.所有帧间隔:32ms;

5.忽略ACK/NAK.



-------------------------------------电容屏IIC触摸数据----------------------------------------------

B8 20 B9 F6 13 00 00 00 00 00 00 //单点触摸 短按,约0.4S

B8 20 B9 F6 13 00 00 00 00 00 00 //间隔32ms

B8 20 B9 F6 13 00 00 00 00 00 00 

B8 20 B9 F6 13 00 00 00 00 00 00 

B8 20 B9 00 00 00 00 00 00 00 00 //弹起



B8 20 B9 AE 5D 00 00 00 00 00 00 //单点触摸 长按约1S

B8 20 B9 AE 5D 00 00 00 00 00 00 

B8 20 B9 AE 5D 00 00 00 00 00 00 

B8 20 B9 AE 5D 00 00 00 00 00 00 

B8 20 B9 AE 5D 00 00 00 00 00 00 

B8 20 B9 AE 5D 00 00 00 00 00 00 

B8 20 B9 00 00 00 00 00 00 00 00 //弹起



B8 20 B9 07 02 00 00 00 00 00 00 //单点触摸 快速短按,约0.1S,最短

B8 20 B9 07 02 00 00 00 00 00 00 //间隔32ms

B8 20 B9 00 00 00 00 00 00 00 00 //弹起



B8 20 B9 BB 85 00 00 00 00 00 00 //两点触摸

B8 20 B9 BB 85 A0 3B 00 00 00 00 //两点触摸

B8 20 B9 BB 85 A0 3B 00 00 00 00 

B8 20 B9 BB 85 A0 3B 00 00 00 00 

B8 20 B9 00 00 00 00 00 00 00 00 //弹起



B8 20 B9 C1 4D 00 00 00 00 00 00 //单点手势

B8 20 B9 C1 4D 00 00 00 00 00 00 

B8 20 B9 C1 4D 00 00 00 00 00 00 

B8 20 B9 B8 54 00 00 00 00 00 00 

B8 20 B9 AE 5D 00 00 00 00 00 00 

B8 20 B9 A6 67 00 00 00 00 00 00 

B8 20 B9 9C 73 00 00 00 00 00 00 

B8 20 B9 92 7C 00 00 00 00 00 00 

B8 20 B9 89 85 00 00 00 00 00 00 

B8 20 B9 81 8C 00 00 00 00 00 00 

B8 20 B9 7B 91 00 00 00 00 00 00 

B8 20 B9 78 95 00 00 00 00 00 00 

B8 20 B9 77 96 00 00 00 00 00 00 

B8 20 B9 00 00 00 00 00 00 00 00 //弹起



B8 20 B9 E3 69 00 00 00 00 00 00 //两点手势

B8 20 B9 E3 69 D2 2E 00 00 00 00 //两点手势

B8 20 B9 E3 69 D2 2E 00 00 00 00 

B8 20 B9 E3 69 D2 2E 00 00 00 00 

B8 20 B9 E3 69 D2 2E 00 00 00 00 

B8 20 B9 DA 72 CA 35 00 00 00 00 

B8 20 B9 D5 78 C5 3A 00 00 00 00 

B8 20 B9 CF 7E C0 3F 00 00 00 00 

B8 20 B9 C8 83 BB 44 00 00 00 00 

B8 20 B9 C2 88 B4 49 00 00 00 00 

B8 20 B9 BB 8D AD 4E 00 00 00 00 

B8 20 B9 B4 92 A6 52 00 00 00 00 

B8 20 B9 AD 97 A0 57 00 00 00 00 

B8 20 B9 A6 9D 99 5B 00 00 00 00 

B8 20 B9 9F A2 92 60 00 00 00 00 

B8 20 B9 98 A7 8C 65 00 00 00 00 

B8 20 B9 91 AC 86 69 00 00 00 00 

B8 20 B9 8A AF 7E 6D 00 00 00 00 

B8 20 B9 83 B3 78 71 00 00 00 00 

B8 20 B9 7D B7 72 74 00 00 00 00 

B8 20 B9 7A B9 6E 77 00 00 00 00 

B8 20 B9 77 BB 6B 79 00 00 00 00 

B8 20 B9 00 00 00 00 00 00 00 00 //弹起

---------------------------------------------------------------*/


推荐阅读

史海拾趣

问答坊 | AI 解惑

显示技术 电子纸达人请进,关于超薄低耗

熟悉显示技术的达人们不晓得有没注意到,美国君子杂志esquire,10月刊集成了电子显示到纸质杂志的封面,具体包括封面的标题电子显示,和 封二的 福特广告。 显示厚度只有max.2.0mm, 现在已经确定不是EL冷光技术。具体效果图可以参见这个视频: htt ...…

查看全部问答>

wince播放视频文件,c#开发。

网上找了些资料,关于用directshow的,依照上面的代码,运行的时候出错。 private object CreateComObj(Guid ClsID)         {             object com = null;   ...…

查看全部问答>

请教一个桌面背景图片的问题

wince可以设置桌面背景图片嘛?如何设置?…

查看全部问答>

求助关于cadence画原理图中关于OFFPAGELEFT的问题

关于分页的电路连接(平坦式)中需要用到Off - page Connector, 其中有两项(或者是4项):OFFPAGELEFT-L和OFFPAGELEFT-R 我看周润景的书上写着:设置采用双向箭头,结点在左(右)的电路端口连接器 而层次式连接器Hierarchical port中有:双向 ...…

查看全部问答>

modelsim仿真出现的错误

Modesim仿真出现的错误# ** Warning: (vsim-WLF-5000) Waveform log file vsim.wlf currently in use.# File in use by: haohao  Hostname: hao  ProcessID: 1164#           Attempt ...…

查看全部问答>

谁能告诉一下ULINK2的价格!

                                  …

查看全部问答>

请教怎么才能使得输出电压步进可调??

应该通过什么的方法来实现开关电源的输出电压连续步进可调输出??如30~36V之间,步进量为1V,应该怎么做,请大家给个思路>…

查看全部问答>

关于嵌入式小作品的创意

大家好,我们正在学习单片机和嵌入式,老师要求每个人设计一个有趣或者使用的作品。想了好久,没有什么好的思路,有人有想法能指点一二么??…

查看全部问答>

LPC11u24和1769程序烧写

刚开始用恩智浦的平台。很多问题不懂。 LPC11u24和1769程序烧写需要用什么烧写器? 这两种芯片自带AD吗?英文DATASHEET实在看不懂………

查看全部问答>

spi 从方式 工作不正常

如果我用2条数据线是不是就要3条线了,这样的话库都不支持了,库里最多2条线啊,还有就是我上面的ST的片选脚那样设置是否合理啊,而且用SPI-RECIVEDATA()这个函数的时候一直读到的是255。 不知道是什么原因  请各位帮忙…

查看全部问答>