扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
module iic_func_module
成都创新互联公司是一家集网站建设,河间企业网站建设,河间品牌网站建设,网站定制,河间网站建设报价,网络营销,网络优化,河间网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
(
input CLK,
input RSTn,
input [1:0]Start_Sig,
input [7:0]Addr_Sig,
input [7:0]WrData,
output [7:0]RdData,
output Done_Sig,
output SCL,
inout SDA,
/***************/
output [4:0]SQ_i
);
/*************************/
parameter FREQ = 9'd200;
/*************************/
reg [4:0]i;
reg [4:0]Go;
reg [8:0]C1;
reg [7:0]rData;
reg rSCL;
reg rSDA;
reg isAck;
reg isDone;
reg isOut;
always @ ( posedge CLK or negedge RSTn )
if( !RSTn )
begin
i = 5'd0;
Go = 5'd0;
C1 = 9'd0;
rData = 8'd0;
rSCL = 1'b1;
rSDA = 1'b1;
isAck = 1'b1;
isDone = 1'b0;
isOut = 1'b1;
end
else if( Start_Sig[0] )
case( i )
0: // Start
begin
isOut = 1;
rSCL = 1'b1;
if( C1 == 0 ) rSDA = 1'b1;
else if( C1 == 100 ) rSDA = 1'b0;
if( C1 == FREQ -1) begin C1 = 9'd0; i = i + 1'b1; end
else C1 = C1 + 1'b1;
end
1: // Write Device Addr
begin rData = {4'b1010, 3'b000, 1'b0}; i = 5'd7; Go = i + 1'b1; end
2: // Wirte Word Addr
begin rData = Addr_Sig; i = 5'd7; Go = i + 1'b1; end
3: // Write Data
begin rData = WrData; i = 5'd7; Go = i + 1'b1; end
/*************************/
4: // Stop
begin
isOut = 1'b1;
if( C1 == 0 ) rSCL = 1'b0;
else if( C1 == 50 ) rSCL = 1'b1;
if( C1 == 0 ) rSDA = 1'b0;
else if( C1 == 150 ) rSDA = 1'b1;
if( C1 == 50 + FREQ -1 ) begin C1 = 9'd0; i = i + 1'b1; end
else C1 = C1 + 1'b1;
end
5:
begin isDone = 1'b1; i = i + 1'b1; end
6:
begin isDone = 1'b0; i = 5'd0; end
/*******************************/ //function
7,8,9,10,11,12,13,14:
begin
isOut = 1'b1;
rSDA = rData[14-i];
if( C1 == 0 ) rSCL = 1'b0;
else if( C1 == 100 ) rSCL = 1'b1;
if( C1 == FREQ -1 ) begin C1 = 9'd0; i = i + 1'b1; end
else C1 = C1 + 1'b1;
end
15: // waiting for acknowledge
begin
isOut = 1'b0;
if( C1 == 150 ) isAck = SDA;
if( C1 == 0 ) rSCL = 1'b0;
else if( C1 == 100 ) rSCL = 1'b1;
if( C1 == FREQ -1 ) begin C1 = 9'd0; i = i + 1'b1; end
else C1 = C1 + 1'b1;
end
16:
if( isAck != 0 ) i = 5'd0;
else i = Go;
/*******************************/ // end function
endcase
else if( Start_Sig[1] )
case( i )
0: // Start
begin
isOut = 1;
rSCL = 1'b1;
if( C1 == 0 ) rSDA = 1'b1;
else if( C1 == 100 ) rSDA = 1'b0;
if( C1 == FREQ -1 ) begin C1 = 9'd0; i = i + 1'b1; end
else C1 = C1 + 1'b1;
end
1: // Write Device Addr
begin rData = {4'b1010, 3'b000, 1'b0}; i = 5'd9; Go = i + 1'b1; end
2: // Wirte Word Addr
begin rData = Addr_Sig; i = 5'd9; Go = i + 1'b1; end
3: // Start again
begin
isOut = 1'b1;
if( C1 == 0 ) rSCL = 1'b0;
else if( C1 == 50 ) rSCL = 1'b1;
else if( C1 == 250 ) rSCL = 1'b0;
if( C1 == 0 ) rSDA = 1'b0;
else if( C1 == 50 ) rSDA = 1'b1;
else if( C1 == 150 ) rSDA = 1'b0;
if( C1 == 300 -1 ) begin C1 = 9'd0; i = i + 1'b1; end
else C1 = C1 + 1'b1;
end
4: // Write Device Addr ( Read )
begin rData = {4'b1010, 3'b000, 1'b1}; i = 5'd9; Go = i + 1'b1; end
5: // Read Data
begin rData = 8'd0; i = 5'd19; Go = i + 1'b1; end
6: // Stop
begin
isOut = 1'b1;
if( C1 == 0 ) rSCL = 1'b0;
else if( C1 == 50 ) rSCL = 1'b1;
if( C1 == 0 ) rSDA = 1'b0;
else if( C1 == 150 ) rSDA = 1'b1;
if( C1 == 50 + FREQ -1 ) begin C1 = 9'd0; i = i + 1'b1; end
else C1 = C1 + 1'b1;
end
7:
begin isDone = 1'b1; i = i + 1'b1; end
8:
begin isDone = 1'b0; i = 5'd0; end
/*******************************/ //function
9,10,11,12,13,14,15,16:
begin
isOut = 1'b1;
rSDA = rData[16-i];
if( C1 == 0 ) rSCL = 1'b0;
else if( C1 == 100 ) rSCL = 1'b1;
if( C1 == FREQ -1 ) begin C1 = 9'd0; i = i + 1'b1; end
else C1 = C1 + 1'b1;
end
17: // waiting for acknowledge
begin
isOut = 1'b0;
if( C1 == 150 ) isAck = SDA;
if( C1 == 0 ) rSCL = 1'b0;
else if( C1 == 100 ) rSCL = 1'b1;
if( C1 == FREQ -1 ) begin C1 = 9'd0; i = i + 1'b1; end
else C1 = C1 + 1'b1;
end
18:
if( isAck != 0 ) i = 5'd0;
else i = Go;
/*****************************/
19,20,21,22,23,24,25,26: // Read
begin
isOut = 1'b0;
if( C1 == 150 ) rData[26-i] = SDA;
if( C1 == 0 ) rSCL = 1'b0;
else if( C1 == 100 ) rSCL = 1'b1;
if( C1 == FREQ -1 ) begin C1 = 9'd0; i = i + 1'b1; end
else C1 = C1 + 1'b1;
end
27: // no acknowledge
begin
isOut = 1'b1;
//if( C1 == 100 ) isAck = SDA;
if( C1 == 0 ) rSCL = 1'b0;
else if( C1 == 100 ) rSCL = 1'b1;
if( C1 == FREQ -1 ) begin C1 = 9'd0; i = Go; end
else C1 = C1 + 1'b1;
end
/*************************************/ // end fucntion
endcase
/***************************************/
assign Done_Sig = isDone;
assign RdData = rData;
assign SCL = rSCL;
assign SDA = isOut ? rSDA : 1'bz;
/***************************************/
assign SQ_i = i;
/******************************/
endmodule
面向底层,或高效率 用C:如单片机, 操作系统, 数据库实现
面向上层应用面向对象编程 C++ 高效率 : VC/ QT / GTK编程, 现在WPSlinux版是QT实现的
面向对象编程JAVA, Android, 网页脚本, 也能编写PC机应用比如freemind, 也有嵌入式方面的应用.
再就是网络动态语言, jsp/php/asp , jsp一般用于大型网站, php是开源较多,主要一般网站规模不大的在用, asp 好像不温不火,
比较流行的:go python 还要懂shell脚本编程,
面向硬件的有: VHDL/verilog
matlab:算法仿真
无论选哪种语言,商业开发基本上都会涉及到数据库, db2、oracle mysql好像比较出名
小型数据库sqlite,Android 就是用的这个
总之, 各有各的用处, 看你对哪方面感兴趣, 要学的有很多.
我是学嵌入式的,看一下我收集的嵌入式方面需要掌握的知识与技能:
=================================================================
Altium Designer 原理图和PCB制作
STM32处理器
需求分析、设计方案
嵌入式软硬件系统的设计、测试;
技术文档;
生产工艺技术支持。
-------------------------------------------------------------------
Linux平台下进行软件开发
音视频编解码SDK的进行封装
音视频流存储、传输模块,设计、实现、优化及测试
编写相关开发文档、技术支持文档、使用说明
=====
C/C++ 良好的编程习惯与文档规范;
Linux 下进程间通信及内存管理机制
熟悉H.264,G.7xx,AMR,AAC等音视频编码
熟悉MP4,avi等文件格式
熟悉rtsp/rtp、rtmp、http
海思或者amberalla平台
通和协调能力
----------------------------------------------------------------------------
熟悉1种以上数据库
--------------------------------------------------------------
机器人开发经历或参加机器人相关研究
熟悉Android framework,以及Linux驱动开发,调试,有QT程经验
熟练阅读电路原理图,以及PCB layout;
有效地对新人或普通开发工程师进行辅导
---------------------------------------------------------------------------
悉嵌入式环境下的 C/C++ 语言程序设计和汇编语言程序设计
精通个域网通信协议,如无线网络(Wi-Fi、BlueTooth、Zigbee等)等协议,具有智能家居产品相关经验
RM环境下的系统开发环境与工具,包括平台移植、驱动开发及调试,等等;
数字电路模拟电路基础,熟悉uCOS,Linux,RThread,FreeRTOS等嵌入式操作系统内核程序设计
深入掌握一种或几种嵌入式处理器系统(熟悉Arm、X86、PPC、MIPS)
---------------------------------------------------------------------------
WIFI模块
----------------------------------------
懂日语、32岁以下
-------------------------------------------------------------------------------------
bootloader、内核板级移植、集成。
海思或者amberalla平台开发经验
外设接口和通信协议,包括USB,CAN,LIN,TCP/IP等多种汽车和工业总线技术
无线通讯模块、蓝牙、GPRS、有线及无线通讯
物联网电子消费品产品开发经验
电气电子产品开发和项目管理经验
--------------------------------------------------------------------------------------
精通如下串行总线协议:USB/I2C/SPI/I2S/UART
悉Boot Loader,
具有Linux BSP经验者
具备良好沟通、协作、学习能力,能够主动在项目中承担起责任
写和移植内核设备驱动
裁剪和优化的Linux内核
----------------------------------------------------------------------------------
团队管理经验
硬件基本原理,能看懂原理图和PCB
精通linux内核架构,熟悉多线程编程
精通多种常用传输总线协议,如IIC、SPI、CAN、IIS;
对无线网络数据传输有较深了解;使用过无线传输模块,GPRS、3G等
WIFI驱动、WIFI应用、蓝牙驱动、蓝牙应用有较深的了解
对USB驱动有较深了解,做过USB设备驱动、对SD卡和TF卡
车载电子设备
熟悉视频、音频处理,熟悉视频、音频编解码处理;
熟悉安卓架构,能编写安卓中间件
ARM或DSP嵌入式软件开发经验
-----------------------------------------------------------------------------------------------
入式Linux系统体系结构设计,系统内核维护;
根据需求制定系统整体软件方案,划分软件模块;
优化uboot、Linux内核相关模块;
深入了解ARM(Cortex-A8以上)体系结构
常用驱动程序及相关协议,如:Framebuffer、以太网、USB、CAN总线、I2C、SPI等。可以对驱动程序进行深度的优化;
对视频/图像有较深刻认识,了解视频/图像编解码相关知识;
使用OPenGL完成图像渲染;
负责研究和开发3D引擎到Opengl的标准化接口;
深入理解QT底层实现机制。熟悉QT在不同平台之间的移植;
Ti/Freescale ARM开发经验
认真对待每一项工作,同事之间团结互助;
良好的英文交流能力
--------------------------------------------------------------------------------------------
熟悉wifi,nrf2401,camera,audio 等外围模组及相关协议
熟悉ucos—2
智能家居方面的实际开发经验
----------------------------------------------------------------------------------
单片机、ARM、Cotrex-M3/M4等处理器
掌握网络、UART、LCD、SPI、I2C、RS485
搭建嵌入式Linux软硬件系统
熟悉Linux内核机制
熟练完成嵌入式下linux的驱动开发与应用开发。
熟悉TCP/IP协议栈,Socket通信编程
熟悉HTTP、SNMP、DHCP等应用层协议。
CAN总线、WIFI、Zigbee等相关产品开发经验
良好的语言表达沟通能力和团队合作精神
------------------------------------------------------------------------------------
broad expertise
-----------------------------------------------------------------------------------------
具有linux,freeRTOS等主流嵌入式系统开发经验
熟悉TCP/IP、WIFI、蓝牙BLE、I2C等协议
有音频、Andorid开发、Java虚拟机、云端数据同步、智能家居产品等开发经验
嵌入软件, 驱动,协议栈,协议开发经验
精通TCP/IP协议
用网络协议,了解防火墙, 路由交换技术
无线协议802.11,802.1X
熟悉Wi-Fi、ZigBee、蓝牙,模拟信号、UART、RS232、RS485、各种现场总线、HART-IP、TCP/IP、OPC、OPC UA、BACNet等协议
立志于一起打造互联网+工业。
---------------------------------------------------------------------------------------------
熟悉8583、EMV、PBOC等相关行业知识
3年以上 嵌入式 Linux 驱动开发经验
读懂硬件图纸
熟练掌握 i2c、i2s、spi、gpio、uart、usb、lcd/framebuffer 等常用 Linux 驱动
Linux 中断程序开发;
电机控制驱动、Linux系统管理、系统版本升级 等开发经验
---------------------------------------------------------------------------------------------
雷达、超声项目相关的研发
扎实全面的硬件电路设计、调试能力,熟悉模拟、数字及混合电路;
拥有DSP(TI TMS系列为佳),ARM, FPGA/CPLD 设计经验;
解决并优化整体系统的信噪比、电磁屏蔽、能耗管理和热耗散管理
熟悉PCB 布线,制版和调试
有担任规模量产项目技术研发经历
掌握交叉编译环境、熟练典型Linux系统调用和应用程序开发
熟练掌握至少一种版本管理工具(如:SVN、GIT等);
对Linux系统内核及驱动程序有深入理解
对Linux内核进行深度定制和修改
------------------------------------------------------------------------------------------------
熟悉uC/OS下Camera,LCD、WIFI、RIL、IIC、SPI、UART、2G、各类型Sensor等各种外设驱动驱动模型
做过传统单片机 pos 机 或类似stm32 pos机项目经验
熟悉PBOC协议
能够使用示波器和逻辑分析仪等
--------------------------------------------------------------------
C/C++ 网络及多线程编程
熟悉OpenWrt开发,移植
悉Qualcomm SDK者优先,有一定的算法基础,
----------------------------------------------------------------
用有电子工具软件PROTEL\PADS等
网关产品,协议转换类产品编程经验
精通TCP/IP,ZIGBEE,MQTT协议,了解至少一种工业总线;
能独立承担产品的设计规划,周边接口硬件电路设计,功能软件设计;
---------------------------------------------------------------------
熟悉C/C++/JAVA/J2ME语言编程
入式Linux操作系统,Linux驱动开发
精通Android开发平台及Framework框架原理
熟悉基本无线协议;
责任心和进取心
团队协作
善于沟通和表达
独立设计优化和移植HAL层外设模块,如Camera、WiFi、蓝牙、触摸屏等模块;
将Android系统移植到特定硬件平台上
给上层app及UI开发提供支持
--------------------------------------------------------------------------
移植和底层驱动
熟悉Linux内核架构;
Makefile、shell等脚本语言
熟悉RTP,RTCP,RTSP等流媒体协议
熟练使用Ethereal、Wireshark和Tcpdump等网络协议分析工具;
DVR、MDVR、DVS等监控产品开发经验
-------------------------------------------------------------------------
产品的规划设计、安卓等平台的底层驱动程序编写调试
主板调试及外设调试,确保项目中驱动部分的质量和进度
独立完成各业务模块的驱动开发工作以及技术难题攻关、技术评估;
模块的需求分析、详细设计、编码实现、和单元自测,参与产品需求分析并制定技术实施方案,根据产品功能需求设计并完成软件实现,了解项目需求和业务流程。
2年以上单片机系统软件开发经验,2年以上的Android系统软件驱动开发经验(有成熟产品移植开发经验),有WINCE平台开发经验更佳;
uboot、kenel Driver开发以及HAL层等开发、调试和集成工作
熟悉ARM系列处理器架构,包括简单的ARM处理器(Cortex-M3/M0)和复杂的多核ARM处理器的应用设计经验;
无线网络数据传输有较深了解;使用过无线传输模块,GPRS、3G等;
对USB驱动有较深了解,做过USB设备驱动、对SD卡和TF卡等实际应用上有独到的心得体会或做过车载电子设备
够独立解决各类底层疑难问题,能够同硬件和软件应用工程师一起合作解决复杂问题;
责任心,主动学习,团队沟通协作,文档输出, 英语读写
---------------------------------------------------------------------------------
精通Wifi协议及应用开发,熟悉博通与MTK系列wifi芯片;
熟悉TCPIP协议,熟悉HTTP、FTP等网络协议应用和开发
熟悉Wifi、射频产品的生产和测试
必须有broadcom、Atheros或MTK的一种wifi方案经验
自我驱动的学习和工作习惯
对未知技术和领域能快速掌握并实践
沟通、协调, 项目管理、团队管理
---------------------------------------------------------------------------------------
Socket编程,多线程编程,进程间通信
熟悉TCP/IP协议;熟悉HTTP,UDP/RTP/RTCP/RTS等流媒体传输与控制协议;
熟悉音视频压缩技术
------------------------------------------------------------
悉实时操作系统如ThreadX,FreeRTOS
熟悉串口,TCPIP协议,WIFI,GPIO,JTAG等底层编程
家电无线模块软件开发
不同硬件平台选型开发
撰写并维护相关技术文档
-----------------------------------------------------------------------
通32 bit ARM单片机系统开发,熟悉Atmel芯片
精通uCOSII系统,有相关开发经验
OS(uCOSII与Linux)移植、驱动编写与应用软件开发
------------------------------------------------------------------------
主流单片机、ARM、FPGA硬件平台
熟悉VHDL/Verilog语言进行FPGA开发;
有效实现板级系统间数据通讯,
了解卫星通讯协议
熟悉使用LabView进行数据采集和系统测试
独立进行PCB开发并联系相关厂家进行生产
熟悉中国电子信息产业链,不仅懂得怎样设计, 还要知道怎样利用现有市场产品, 经济快速有效地实现自己的设计
了解电子产品国际市场, 能够从市场角度去开发产品;
英语能力可以应付国际化工作环境, 能够熟练使用法语德语更好。
在本专业领域内有丰富人脉,能够在全世界范围内为具体问题找到合适的人;
master mode 主机模式 (下面例子中老大的模式)
slave mode 从机模式 (下面例子中小混混的模式)
master or slave transmit mode 主机或者从机 发送模式
master or slave receive mode 主机或者从机 接受模式
i2c是一个传输的协议,可以通过协议来传递数据,需要有SCL时钟线和SDA数据线
主机就像老大,控制时钟线,从机就像小混混,小混混可以有1个或者多个 每个有固定的编号
也就是地址,老大如果要叫小混混打一个人,先发送小混混的编号(地址),小混混确认后,老
大再发打人的资料(数据),然后小混混得到数据 ,去执行,这就是主机模式!
英语(English)是印欧语系-日耳曼语族下的语言,由26个字母组合而成,英文字母渊源于拉丁字母,拉丁字母渊源于希腊字母,而希腊字母则是由腓尼基字母演变而来的。英语是国际指定的官方语言(作为母语),也是世界上最广泛的第一语言,英语包含约49万词,外加技术名词约30万个,是词汇最多的语言,也是欧盟以及许多国际组织以及英联邦国家的官方语言,拥有世界第三位的母语使用者人数,仅次于汉语和西班牙语母语使用者人数。
英语由古代从丹麦等斯堪的纳维亚半岛以及德国、荷兰及周边移民至不列颠群岛的盎格鲁、撒克逊以及朱特部落的白人所说的语言演变而来,并通过英国的殖民活动传播到了世界各地。由于在历史上曾和多种民族语言接触,它的词汇从一元变为多元,语法从“多屈折”变为“少屈折”,语音也发生了规律性的变化。在19至20世纪,英国以及美国在文化、经济、军事、政治和科学在世界上的领先地位使得英语成为一种国际语言。如今,许多国际场合都使用英语做为沟通媒介。
英语也是与电脑联系最密切的语言,大多数编程语言都与英语有联系,而且随着网络的使用,英文的使用更普及。英语是联合国的工作语言之一。 苏格兰语、低地撒克逊语、丹麦语、德语、荷兰语、南非荷兰语和英语也很接近。拥有法国血统的诺曼人于11世纪征服英格兰王国,带来数万法语词汇和拉丁语词汇,很大程度地丰富了英语词汇外,相对也驱使不少原生的语汇作废。
i2c有其协议的,我当时从不会到掌握其协议用了一阵子,就是狂读协议和例程
我把当时用非斯卡尔单片机读i2c mems传感器的历程写在下面
#include hidef.h
#include "derivative.h"
#define IIC_SDA_CTL PTCDD_PTCDD1
#define IIC_SDA_DAT PTCD_PTCD1
#define IIC_SCL_CTL PTCDD_PTCDD0
#define IIC_SCL_DAT PTCD_PTCD0
#define IIC_MST_HI 0
#define IIC_MST_LO 1
void IIC_Start(void);
void IIC_Restart(void);
void IIC_Stop(void);
byte IIC_SendByte(byte);
byte IIC_Read(byte *, byte);
byte IIC_Write(byte *, byte);
void IIC_Delay(void);
void IIC_Delay(void)
{
byte i;
for (i=0;i8;i++) {}
}
//==============================================================
// Master generates a START condition on IIC bus
//==============================================================
void IIC_Start(void)
{
IIC_SDA_CTL = IIC_MST_HI;
IIC_SCL_CTL = IIC_MST_HI;
IIC_Delay();
IIC_SDA_CTL = IIC_MST_LO;
IIC_SDA_DAT = 0;
IIC_Delay();
IIC_SCL_CTL = IIC_MST_LO;
IIC_SCL_DAT = 0;
IIC_Delay();
}
//==============================================================
// Master generates a RESTART condition on IIC bus
//==============================================================
void IIC_Restart(void)
{
IIC_SDA_CTL = IIC_MST_HI; //SDA back to high while SCL remain in low
IIC_Delay();
IIC_SCL_CTL = IIC_MST_HI; //SCL back to high, bus idle now
IIC_Delay();
IIC_SDA_CTL = IIC_MST_LO; //RESTART condition occur
IIC_Delay();
IIC_SCL_CTL = IIC_MST_LO; //SCL to low for standby
IIC_Delay();
}
//==============================================================
// Master generates a STOP condition on IIC bus
//==============================================================
void IIC_Stop(void)
{
IIC_SDA_CTL = IIC_MST_LO; //make sure SDA is low
IIC_Delay();
IIC_SCL_CTL = IIC_MST_HI; //I2C_SCL_CTL go to high first
IIC_Delay();
IIC_SDA_CTL = IIC_MST_HI; //I2C_SDA_CTL have low-high transition while SCL is high
IIC_Delay();
}
//==============================================================
// Master send out a byte of data and return with ACK/NACK
// return with 0x00 if ACK received
// return with 0xff if NACK received
//==============================================================
byte IIC_SendByte(byte outDat)
{
byte bit;
//send out 8-bit data
for (bit=0;bit8;bit++) {
if (outDat0x80)
IIC_SDA_CTL = IIC_MST_HI;
else
IIC_SDA_CTL = IIC_MST_LO;
IIC_Delay();
IIC_SCL_CTL = IIC_MST_HI;
IIC_Delay();
IIC_SCL_CTL = IIC_MST_LO;
outDat = 1;
}
//check for the ACK/NACK
IIC_SDA_CTL = IIC_MST_HI; //master release SDA
IIC_Delay();
IIC_SCL_CTL = IIC_MST_HI; //master send a clock
IIC_Delay();
if (IIC_SDA_DAT) bit = 0xff; //NACK
else bit = 0; //ACK
IIC_SCL_CTL = IIC_MST_LO;
IIC_Delay();
return(bit);
}
//==============================================================
// Master write a string of bytes through IIC us
// Return with 0x00 if successful
// Return with 0xff if failed
//==============================================================
byte IIC_Write(byte *buff, byte total)
{
while (total) {
if (IIC_SendByte(*buff++)) //get NACK after data byte out
return(0xff); //abort
total--;
//__RESET_WATCHDOG(); //needed only for EEPROM byte-program
}
return(0);
}
//==============================================================
// Master read a byte of data and set ACK/NACK
// return with data read
//==============================================================
byte IIC_ReadByte(byte ackFlag)
{
byte bit, dat;
IIC_SDA_CTL = IIC_MST_HI; //make sure master release SDA
//read 8 bits sof data
for (bit=0;bit8;bit++) {
dat = 1;
IIC_SCL_CTL = IIC_MST_HI;
IIC_Delay();
if (IIC_SDA_DAT) //read back data
dat |= 0x01;
IIC_SCL_CTL = IIC_MST_LO;
IIC_Delay();
}
//echo with ACK/NACK
if (ackFlag==0)
IIC_SDA_CTL = IIC_MST_LO; //echo back ACK
else
IIC_SDA_CTL = IIC_MST_HI; //echo back NACK
IIC_Delay();
IIC_SCL_CTL = IIC_MST_HI;
IIC_Delay();
IIC_SCL_CTL = IIC_MST_LO;
IIC_Delay();
return(dat);
}
//==============================================================
// Master read a string of data bytes through IIC us
//==============================================================
byte IIC_Read(byte *buff, byte total)
{
byte count;
if (total==0) return(0);
if (total==1) { //read one byte only
buff[0] = IIC_ReadByte(1); //NACK after read
return(1);
}
else { //read more than one bytes
count = 0;
while(total1) {
IIC_Delay();
buff[count++] = IIC_ReadByte(0); //ACK after read
total--;
__RESET_WATCHDOG();
}
IIC_Delay();
buff[count++] = IIC_ReadByte(1);
return(count);
}
}
然后你去网上搜索iic总线协议,把协议多读几遍慢慢就会了~~要不你把邮箱给我我发给你.总之很简单的 不用害怕,学学就会了
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流