历史上的今天
返回首页

历史上的今天

今天是:2024年10月15日(星期二)

正在发生

2019年10月15日 | pic单片机的模拟I2C通信

2019-10-15 来源:eefocus

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;                      Copyright (C) 1997 by Innovatus

; This code may be distributed and used freely provided that this

; copyright notice stays intact and that any modifications are noted.

; For more information about Innovatus: http://www.innovatus.com

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;    File Name: i2c_low.asm

;       Author: Alan G. Smith

;      Purpose: This code is borrowed from Microchip with all of the fancy

;               stuff taken out.

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


InitI2CBusMaster


;************************************************************

TxmtStartBit

   bsf    Bus_Busy                       ; on a start condition bus is busy

   bsf    STATUS, RP0                    ; Select page 1

   bsf    _SDA                           ; set SDA high

   bsf    _SCL                           ; clock is high

   call   Delay40uSec                    ; This is necessary for setup time

   bcf    _SDA                           ; This gives a falling edge on SDA while clock is high

   call   Delay47uSec                    ; Necessary for START HOLD time

   return

;************************************************************

TxmtStopBit

   bsf    STATUS, RP0                    ; Select page 1

   bcf    _SCL                           ; clock is low

   bcf    _SDA                           ; set SDA low

   bsf    _SCL                           ; clock is pulled up

   call   Delay40uSec                    ; Setup time for STOP condition

   bsf    _SDA                           ; rising edge on SDA while CLOCK is high

   call   Delay47uSec                    ; makes sure a START isn't sent immediately after a STOP

   bcf    Bus_Busy                       ; The bus isn't busy anymore

   return

;************************************************************

AbortI2C

   call   TxmtStopBit                    ; Send a stop bit

   bsf    Abort                          ; set the abort bit

   return

;************************************************************

TxmtSlaveAddr

   movf   SlaveAddr, w                   ; Move slave address to W

   bcf    ACK_Error                      ; reset Acknowledge error bit

   movwf  I2CData                        ; move W to I2C Data

   bcf    I2CData, LSB                   ; Set for write

   btfsc  Slave_RW                       ; If skip then write operation

   bsf    I2CData, LSB                   ; Clear for read

   call   SendData                       ; send the address

   btfss  Txmt_Success                   ; skip if successful

   goto   AddrSendFail                   ; Oops, we failed

   retlw  TRUE                           ; return true

AddrSendFail

   btfss  ACK_Error                      ; was there an error acknowledging

   retlw  FALSE                          ; No, so return 0

   call   TxmtStopBit                    ; Address not acknowleged, so send STOP bit

   retlw  FALSE                          ; Unsuccessful, so return 0


;************************************************************

SendData

; We might should make a copy of the data here, the example does but I don't see why!!!

   bsf    Txmt_Progress                  ; We are in the middle of transmitting

   bcf    Txmt_Success                   ; reset success bit

   movlw  0x08

   movwf  I2CBitCount                    ; Set I2C Bit Count to 8

   bsf    STATUS, RP0                    ; Select page 1

TxmtNextBit:

   bcf    _SCL                           ; Set clock Low

   rlf    I2CData, F                     ; MSB First, Note that I2CData is Destroyed

   bcf    _SDA                           ; Set clock based on what the MSB is

   btfsc  STATUS,C                       ; Was the MSB a 1

   bsf    _SDA                           ; Nope set it high

   call   Delay47uSec                    ; guarantee min LOW TIME tLOW & Setup time

   bsf    _SCL                           ; set clock high

   call   Delay40uSec                    ; guarantee min HIGH TIME tHIGH

   decfsz I2CBitCount, F                 ; are we done yet

   goto   TxmtNextBit                    ; nope, send the next bit

;

; Check For Acknowledge

;

   bcf    _SCL                           ; reset clock

   bsf    _SDA                           ; Release SDA line for Slave to pull down

   call   Delay47uSec                    ; guarantee min LOW TIME tLOW & Setup time

   bsf    _SCL                           ; clock for slave to ACK

   call   Delay40uSec                    ; guarantee min HIGH TIME tHIGH

   bcf    STATUS, RP0                    ; Select PAGE 0 to test SDA pin

   btfsc  SdaPin                         ; SDA should be pulled low by slave if OK

   goto   TxmtErrorAck                   ; Uh oh, slave isn't behaving (or isn't there)

   bsf    STATUS, RP0                    ; Select PAGE 1

   bcf    _SCL                           ; reset clock

   bcf    Txmt_Progress                  ; reset progress bit in Bus Status

   bsf    Txmt_Success                   ; Transmission successful

   bcf    ACK_Error                      ; ACK OK

   return

TxmtErrorAck

   bsf    STATUS,RP0                     ; select page 1

   bsf    _SDA                           ; tristate SDA

推荐阅读

史海拾趣

Deutsch公司的发展小趣事

为了进一步扩大市场份额,Deutsch公司开始积极寻求国际合作和市场扩张的机会。公司首先通过市场调研,确定了目标市场,并制定了详细的市场拓展计划。随后,通过与当地合作伙伴建立合作关系,Deutsch公司成功进入了新兴市场。在国际市场上,公司凭借其高品质的产品和优质的客户服务,赢得了客户的信任和认可。这些努力使得Deutsch公司的市场份额逐年上升,成为电子行业的领军企业之一。

北京人民电器厂公司的发展小趣事

近年来,随着新能源产业的快速发展,北京人民电器紧跟时代步伐,在新能源领域取得了重要突破。公司推出的真安型零飞弧直流断路器,解决了直流低压系统中长期存在的外喷电弧问题,为新能源行业的发展提供了重要的技术支持。这一创新成果不仅得到了行业的广泛认可,也为公司在新能源领域的发展打开了新的局面。

这五个故事只是北京人民电器在电子行业发展历程中的一部分,但它们足以展现出公司在技术创新、产品应用、生产自动化、人才队伍建设以及新能源领域发展等方面的努力和成就。这些故事不仅记录了北京人民电器的成长轨迹,也见证了中国电子行业的蓬勃发展。

FCT electronic公司的发展小趣事

近年来,电子行业面临着成本上升、全球不稳定以及经济动荡等多重挑战。FCT electronic公司凭借其在挠性电路板领域的深厚积累,积极应对这些挑战。公司加强了对供应链的管理,提高了生产效率,降低了成本。同时,FCT electronic公司还加大了对研发的投入,推动产品向高端化、智能化方向转型升级。这些努力使FCT electronic公司在行业中保持了领先地位。

Automatic Connector公司的发展小趣事

在电子连接器行业,品质是决定企业生死存亡的关键。Automatic Connector公司深知这一点,因此在生产过程中严格执行品质管理标准。公司引进了先进的生产设备和质量检测仪器,确保每一件产品都符合高标准的质量要求。同时,公司还建立了完善的售后服务体系,及时解决客户在使用过程中遇到的问题。凭借卓越的品质和优质的服务,Automatic Connector赢得了客户的信赖和好评。

Barnbrook Systems Limited公司的发展小趣事

在电子产品行业,产品质量和客户服务是企业生存和发展的关键。Barnbrook深知这一点,因此在发展过程中始终坚持严格的品质管理和优质的客户服务。公司建立了完善的质量管理体系,对每一道工序都进行严格把关,确保产品的稳定性和可靠性。同时,Barnbrook也重视客户反馈和需求,不断优化产品和服务,赢得了客户的信任和好评。

Crane Connectors公司的发展小趣事

Crane Connectors公司深知产品质量是企业生存和发展的根本。因此,公司始终将质量管理放在首位,建立了完善的质量管理体系。从原材料采购、生产加工到产品检验、售后服务,每一个环节都严格把控,确保产品质量符合国际标准和客户要求。同时,公司还不断引进先进的质量管理理念和技术手段,提升质量管理水平。这些举措使得公司的产品质量得到了客户的高度认可,进一步提升了公司的市场竞争力。

问答坊 | AI 解惑

4-20mA 电流环路隔离器(ISO 4-20mA)

4-20mA 电流环路隔离器(ISO 4-20mA)低成本、小体积,两线制4-20mA电流环路隔离 IC说 明: ISO 4-20mA电流环隔离芯片是单片两线制隔离接口芯片,该IC内部包含有电流信号调制解调电路、信号耦合隔离变换电路等。很小的输入等效电阻,使该IC的输入电 ...…

查看全部问答>

t6963指令详解

最近一直在弄lcd液晶模块,很多液晶模块都是靠t6963控制的,很多lcd的pdf文档都没有详细介绍t6963控制指令,在此给出t6963指令详解,希望刚从事电子行业的朋友们,一起共同勉励!…

查看全部问答>

新手,急问。关于Unix移植Vxworks

Unix下的一个程序,我想把它移植到Vxworks上,编译的时候系统提示 找不到 我知道这是Unix下的 头文件,如何才能在Vxworks下编译通过。…

查看全部问答>

求助:wince键盘开发

首先,我们在arm下开发wince4.2系统 我们的系统打算用键盘控制,键盘上有F1-F10功能键与0-9数字键复用, 上下左右方向键,回车键等,打算自己做键盘,用一个单片机控制键盘,用串口将键盘的键码传输到arm。功能键用来实现一些功能界面的转换,数字 ...…

查看全部问答>

选择嵌入式培训机构注意什么

1.了解培训机构的师资情况。这一点对参加培训的学员来说是最重要的,每个机构都会说自己师资很好,但实际能不能在短期的培训过程中让学员学到有用的知识,虽然有个人主观学目前,关于嵌入式的培训机构多如牛毛,想学习嵌入式,我们必须要学会选择, ...…

查看全部问答>

我的DIY的LC测量器完成了

从开始搜集资料到现在,已有一段时日了,虽是断断续续在做,但最终还是有结果的了。我在这里用的是CM3微控器,就用了我手头上有的这块从eeworld申请到得stellaris  8962评估板。显示是用1602,因评估板上自带OLED屏,我就先用它作显示,它用着 ...…

查看全部问答>

Linux 红帽的系统,添加中文字库

        大家帮忙看一下,在系统里面英文是可以支持的,中午汉字不 支持,求高人指点一下!…

查看全部问答>

电路是如何记忆数据的?

哪位高人知道记忆电路的原理,具有记忆功能的电路有哪些?看什么书可以找到答案?…

查看全部问答>

DSP烧录到Flash中去了,仿真可运行,拔掉仿真器,开电重启不能运行

DSP烧录到Flash中去了,仿真可运行,不掉电拔掉仿真器可运行,但是断电重启,不能运行,这时候只要把仿真器(connect)连接起来,程式运行。求解???????????????…

查看全部问答>