i2cgo语言 i2c代码的详细讲解
求教verilog i2c小程序
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开发并联系相关厂家进行生产
熟悉中国电子信息产业链,不仅懂得怎样设计, 还要知道怎样利用现有市场产品, 经济快速有效地实现自己的设计
了解电子产品国际市场, 能够从市场角度去开发产品;
英语能力可以应付国际化工作环境, 能够熟练使用法语德语更好。
在本专业领域内有丰富人脉,能够在全世界范围内为具体问题找到合适的人;
i2c中,“master mode 、slave mode”是什么意思?
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有其协议的,我当时从不会到掌握其协议用了一阵子,就是狂读协议和例程
我把当时用非斯卡尔单片机读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总线协议,把协议多读几遍慢慢就会了~~要不你把邮箱给我我发给你.总之很简单的 不用害怕,学学就会了
文章名称:i2cgo语言 i2c代码的详细讲解
文章源于:http://ybzwz.com/article/dohjpso.html