历史上的今天
返回首页

历史上的今天

今天是:2024年10月16日(星期三)

正在发生

2019年10月16日 | PIC16c54的I2C读写程序

2019-10-16 来源:eefocus

TITLE " TWO WIRE/I2C BUS INTERFACE WITH PIC16C5x "
;
LIST P=16C54
;*****************************************************************************
;**  Two wire/I2C Bus READ/WRITE Sample Routines of Microchip's
;**  24Cxx / 85Cxx serial CMOS EEPROM interfacing to a 
;**  PIC16C54 8-bit CMOS single chip microcomputer
;**  Revsied Version 2.0 (4/2/92).
;**
;**     Part use = PIC16C54-XT/JW                                           
;**  Note:  1) All timings are based on a reference crystal frequency of 2MHz
;**            which is equivalent to an instruction cycle time of 2 usec.
;**         2) Address and literal values are read in octal unless otherwise
;**            specified.
;
;
;       Program:          I2CBUS.ASM 
;       Revision Date:   
;                         12-12-95      Compatibility with MPASMWIN 1.30
;
;********************************************************************** 
;
;*****************************************************************************
;
;-----------------------------------------------------------------------------
;       Files Assignment
;-----------------------------------------------------------------------------
;
PC      EQU     2               ; Program counter
STAT    EQU     3               ; PIC status byte
FSR     EQU     4               ; File Select Register
RA      EQU     5               ; Port A use to select device address
RB      EQU     6               ; RB7 = SDA, RB6 = SCL
;
STATUS  EQU     08              ; Status register
FLAG    EQU     09              ; Common flag bits register
EEPROM  EQU     0A              ; Bit buffer
ERCODE  EQU     0B              ; Error code (to indicate bus status)
ADDR    EQU     10              ; Address register
DATAI   EQU     11              ; Stored data input register
DATAO   EQU     12              ; Stored data output register
SLAVE   EQU     13              ; Device address (1010xxx0)
TXBUF   EQU     14              ; TX buffer
RXBUF   EQU     15              ; RX buffer
COUNT   EQU     16              ; Bit counter
;
TIMER0  EQU     18              ; Delay timer0
TIMER1  EQU     19              ; Delay timer1
;
;
;-----------------------------------------------------------------------------
;                     Bit Assignments
;-----------------------------------------------------------------------------
;
; Status bits
;
Z       EQU     2
C       EQU     0
;
; FLAG Bits
;
ERR1    EQU     0               ; Error flag
;
; Instruction Destination Bits
;
F       EQU     1
W       EQU     0
;
; EEPROM Bits
;
DI      EQU     7               ; EEPROM input
DO      EQU     6               ; EEPROM output
;
; I2C Device Bits
;
SDA     EQU     7               ; RB7, data in/out
SCL     EQU     6               ; RB6, serial clock
;
;END FILES/BITS EQUATE
 PAGE
;
;-----------------------------------------------------------------------------
;       Two wire/I2C - CPU communication error status table and subroutine
;-----------------------------------------------------------------------------
;  input  :     W-reg   = error code
;  output :     ERCODE  = error code
;           FLAG(ERR1) = 1
;
;         code          error status mode
;       -------         ------------------------------------------------------
;           1   :       SCL locked low by device (bus is still busy)
;           2   :       SDA locked low by device (bus is still busy)
;           3   :       No acknowledge from device (no handshake)
;           4   :       SDA bus not released for master to generate STOP bit
;-----------------------------------------------------------------------------
;
;Subroutine to identify the status of the serial clock (SCL) and serial data
;(SDA) condition according to the error status table. Codes generated are
;useful for bus/device diagnosis.
;
ERR
BTFSS   FLAG,ERR1       ; Remain as first error encountered
MOVWF   ERCODE          ; Save error code
BSF     FLAG,ERR1       ; Set error flag
RETLW   0
;
;-----------------------------------------------------------------------------
;       START bus communication routine
;-----------------------------------------------------------------------------
;       input   : none
;       output  : initialize bus communication
;-----------------------------------------------------------------------------
;
;Generate START bit (SCL is high while SDA goes from high to low transition)
;and check status of the serial clock.
BSTART
MOVLW   B'00111111'     ; Put SCL, SDA line in output state
TRIS    RB
;***************************************************************************
bsf     RB,SDA          ;make sure sda is high
;***************************************************************************
BSF     RB,SCL          ; Set clock high
MOVLW   1               ; Ready error status code 1
BTFSS   RB,SCL          ; Locked?
CALL    ERR             ; SCL locked low by device
BCF     RB,SDA          ; SDA goes low during SCL high
NOP                     ; Timing adjustment
NOP
NOP
BCF     RB,SCL          ; Start clock train
RETLW   0
;
;END SUB
 PAGE
;
;-----------------------------------------------------------------------------
;       STOP bus communication routine
;-----------------------------------------------------------------------------
;       Input   :       None
;       Output  :       Bus communication, STOP condition
;-----------------------------------------------------------------------------
;
;Generate STOP bit (SDA goes from low to high during SCL high state)
;and check bus conditions.
;
BSTOP
;****************************************************************************
MOVLW   B'00111111'     ; Put SCL, SDA line in output state
TRIS    RB
;****************************************************************************
BCF     RB,SDA          ; Return SDA to low
BSF     RB,SCL          ; Set SCL high
nop
nop
nop
MOVLW   1               ; Ready error code 1
BTFSS   RB,SCL          ; High?
CALL    ERR             ; No, SCL locked low by device
BSF     RB,SDA          ; SDA goes from low to high during SCL high
MOVLW   4               ; Ready error code 4
BTFSS   RB,SDA          ; High?
CALL    ERR             ; No, SDA bus not release for STOP
RETLW   0
;
;END SUB
;
;-----------------------------------------------------------------------------
;       Serial data send from PIC to serial EEPROM, bit-by-bit subroutine
;-----------------------------------------------------------------------------
;       Input   :       None
;       Output  :       To (DI) of serial EEPROM device
;-----------------------------------------------------------------------------
;
BITIN
MOVLW   B'10111111'     ; Force SDA line as input
TRIS    RB
BSF     RB,SDA          ; Set SDA for input
BCF     EEPROM,DI
BSF     RB,SCL          ; Clock high
MOVLW   1
BTFSC   RB,SCL          ; Skip if SCL  is high
GOTO    BIT1
BTFSS   FLAG,ERR1       ; Remain as first error encountered
MOVWF   ERCODE          ; Save error code
BSF     FLAG,ERR1       ; Set error flag
BIT1
BTFSC   RB,SDA          ; Read SDA pin
BSF     EEPROM,DI       ; DI = 1
NOP                     ; Delay
BCF     RB,SCL          ; Return SCL to low     
RETLW   0
;
;END SUB
 PAGE
;
;-----------------------------------------------------------------------------
;       Serial data receive from serial EEPROM to PIC, bit-by-bit subroutine
;-----------------------------------------------------------------------------
;       Input   :       EEPROM file
;       Output  :       From (DO) of serial EEPROM device to PIC
;-----------------------------------------------------------------------------
;
BITOUT
MOVLW   B'00111111'     ; Set SDA, SCL as outputs
TRIS    RB
BTFSS   EEPROM,DO
GOTO    BIT0
BSF     RB,SDA          ; Output bit 0
MOVLW   2
BTFSC   RB,SDA          ; Check for error code 2
GOTO    CLK1
BTFSS   FLAG,ERR1       ; Remain as first error encountered
MOVWF   ERCODE          ; Save error code
BSF     FLAG,ERR1       ; Set error flag
GOTO    CLK1            ; SDA locked low by device
;
BIT0
BCF     RB,SDA          ; Output bit 0
NOP                     ; Delay
NOP
NOP
CLK1
BSF     RB,SCL
MOVLW   1               ; Error code 1
BTFSC   RB,SCL          ; SCL locked low?
GOTO    BIT2            ; No.
BTFSS   FLAG,ERR1       ; Yes.
MOVWF   ERCODE          ; Save error code
BSF     FLAG,ERR1       ; Set error flag
BIT2
NOP
NOP
BCF     RB,SCL          ; Return SCL to low
RETLW   0
;
;END SUB
 PAGE
;
;
;-----------------------------------------------------------------------------
;       RECEIVE         DATA    subroutine
;-----------------------------------------------------------------------------
;       Input   :       None
;       Output  :       RXBUF = Receive 8-bit data
;-----------------------------------------------------------------------------
;
RX
MOVLW   .8              ; 8 bits of data
MOVWF   COUNT
CLRF    RXBUF
;
RXLP
RLF     RXBUF, F        ; Shift data to buffer
SKPC
BCF     RXBUF,0         ; carry ---> f(0)
SKPNC
BSF     RXBUF,0
CALL    BITIN
BTFSC   EEPROM,DI
BSF     RXBUF,0         ; Input bit =1
DECFSZ  COUNT, F        ; 8 bits?
GOTO    RXLP
BSF     EEPROM,DO       ; Set acknowledge bit = 1
CALL    BITOUT          ; to STOP further input
RETLW   0
;
;END SUB
;
;-----------------------------------------------------------------------------
;       TRANSMIT        DATA    subroutine
;-----------------------------------------------------------------------------
;       Input   :       TXBUF
;       Output  :       Data X'mitted to EEPROM device
;-----------------------------------------------------------------------------
;
TX
MOVLW   .8
MOVWF   COUNT
;
TXLP
BCF     EEPROM,DO       ; Shift data bit out.
BTFSC   TXBUF,7         ; If shifted bit = 0, data bit = 0
BSF     EEPROM,DO       ; Otherwise data bit = 1
CALL    BITOUT          ; Serial data out
RLF     TXBUF, F        ; Rotate TXBUF left
SKPC                    ; f(6) ---> f(7)
BCF     TXBUF,0         ; f(7) ---> carry
SKPNC                   ; carry ---> f(0)
BSF     TXBUF,0
DECFSZ  COUNT, F        ; 8 bits done?
GOTO    TXLP            ; No.
CALL    BITIN           ; Read acknowledge bit
MOVLW   3
BTFSC   EEPROM,DI       ; Check for acknowledgement
CALL    ERR             ; No acknowledge from device
RETLW   0
;
;END SUB
 PAGE
;
;-----------------------------------------------------------------------------
;       BYTE-WRITE, write one byte to EEPROM device
;-----------------------------------------------------------------------------
;       Input   :       DATAO= data to be written
;                       ADDR    = destination address
;                       SLAVE   = device address (1010xxx0)
;       Output  :       Data written to EEPROM device
;-----------------------------------------------------------------------------
;
ORG     080             ; The location for BYTE-WRITE routine can be
;                               ; assigned anywhere between (377-777) octal.
WRBYTE
MOVF    SLAVE,W         ; Get SLAVE address
MOVWF   TXBUF           ; to TX buffer
CALL    BSTART          ; Generate START bit
CALL    TX              ; Output SLAVE address
MOVF    ADDR,W          ; Get WORD address
MOVWF   TXBUF           ; into buffer
CALL    TX              ; Output WORD address
MOVF    DATAO,W         ; Move DATA 
MOVWF   TXBUF           ; into buffer
CALL    TX              ; Output DATA and detect acknowledgement
CALL    BSTOP           ; Generate STOP bit
goto    wrt_end
;
;
;
;-----------------------------------------------------------------------------
;       BYTE-READ, read one byte from serial EEPROM device
;-----------------------------------------------------------------------------
;       Input   :       ADDR    = source address
;                       SLAVE   = device address (1010xxx0)
;       Output  :       DATAI   = data read from serial EEPROM
;-----------------------------------------------------------------------------
;
ORG     0C0             ; The location for BYTE-READ routine can be
;                               ; assigned anywhere between (377-777) octal.
RDBYTE
MOVF    SLAVE,W         ; Move SLAVE address 
MOVWF   TXBUF           ; into buffer (R/W = 0)
CALL    BSTART          ; Generate START bit
CALL    TX              ; Output SLAVE address. Check ACK.
MOVF    ADDR,W          ; Get WORD address
MOVWF   TXBUF
CALL    TX              ; Output WORD address. Check ACK.
CALL    BSTART          ; START READ (if only one device is
MOVF    SLAVE,W         ; connected to the I2C bus)
MOVWF   TXBUF
BSF     TXBUF,0         ; Specify READ mode (R/W = 1)
CALL    TX              ; Output SLAVE address
CALL    RX              ; READ in data and acknowledge
CALL    BSTOP           ; Generate STOP bit
MOVF    RXBUF,W         ; Save data from buffer
MOVWF   DATAI           ; to DATAI file.
goto    rd_end
;
;Test program to read and write ramdom
start
movlw   0AE             ;set A2=A1=A0=1
movwf   SLAVE           ;       /
movlw   2               ;set r/w loc. = 2
movwf   ADDR            ;       /
movlw   55              ;write 55 to SEEPROM
movwf   DATAO           ;       /
goto    WRBYTE          ;write a byte
wrt_end
call    delay           ;wait for write
;operation (internal)
goto    RDBYTE          ;read back data
rd_end
movlw   55              ;test if read
xorwf   DATAI,W         ;correct?
btfss   STAT,Z          ;yes then skip
wrong   
goto    wrong
correct
goto    correct
;
;At 2.0Mhz, delay = approx. 3mS.
delay
clrf    1F              ;clear last location
dly1
nop
nop
nop
decfsz  1F, F           ;reduce count
goto    dly1            ;loop
retlw   0
;
org     0x1FF
goto    start
;
ENDTITLE " TWO WIRE/I2C BUS INTERFACE WITH PIC16C5x "

推荐阅读

史海拾趣

G24 Innovations公司的发展小趣事

随着产品质量的不断提升,远阳开始将目光投向更广阔的市场。公司制定了详细的市场拓展计划,并加大了品牌营销力度。2010年前后,远阳成功进军国际市场,与多家国际知名企业建立了长期合作关系。同时,公司也注重在国内市场的布局,通过参加各类行业展会、举办技术研讨会等方式,不断提升品牌知名度和影响力。这一时期,远阳的产品线不断丰富,涵盖了HDMI、光纤线、DP线等多个系列,成为了数据工程电缆领域的佼佼者。

Cliff Electronic Components公司的发展小趣事

为了进一步拓展国际市场,远阳公司开始实施国际化布局战略。公司通过设立海外研发中心、生产基地等方式,加强与全球市场的联系和互动。同时,远阳还积极寻求并购整合机会,通过收购同行业优质企业,实现优势互补和资源共享。这些举措不仅增强了远阳的国际竞争力,也为企业的可持续发展注入了新的动力。

捷嘉电子(Chequers Electronic)公司的发展小趣事

在追求经济效益的同时,捷嘉电子始终不忘履行社会责任。公司积极参与各种公益活动,支持教育事业和环保项目。此外,捷嘉电子还致力于推动行业的可持续发展,通过研发节能环保产品和技术创新来减少对环境的影响。这些举措不仅提升了公司的社会形象,也为电子行业的可持续发展做出了积极贡献。

请注意,以上故事是基于目前所了解的信息进行的虚构创作,并非真实事件。如有雷同,纯属巧合。同时,“Chequers Electronic”并非一个已知的公司名称,因此假设其指的是名为捷嘉的某电子行业相关企业。如需更多信息或详细故事,请提供更多背景资料或具体要求。

HTC Korea(TAEJIN Technology )公司的发展小趣事

在HTC的发展历程中,与微软的合作无疑是重要的一环。早在2002年,微软联合HTC推出了全球第一台搭载Windows mobile的Pocket PC,这一操作系统成为了日后WP 8的前身。得益于微软的信任和支持,HTC能够率先搭载最新的Windows mobile系统,从而成为Windows手机的顶级生产商。这种紧密的合作关系不仅提升了HTC的品牌影响力,还为其带来了大量的市场份额和利润。

Continental公司的发展小趣事

Continental公司,即大陆集团,始建于1871年,总部位于德国的汉诺威市。最初,公司的主营业务是生产橡胶制品以及实心马车和自行车轮胎。在公司的早期历史中,一个关键的转折点出现在1882年,公司决定以猖獗的烈马作为品牌LOGO,象征着所生产的轮胎像强壮的烈马一般所向披靡。这一标志不仅赋予了轮胎强大的象征意义,还让人们开始将这些轮胎称为“马牌轮胎”。进入19世纪90年代,大陆集团成为了第一家生产充气马车和自行车胎的德国公司,这标志着其在轮胎制造技术上的重要突破。

德欣(COV)公司的发展小趣事

德欣(COV)公司自创立之初,就致力于压敏电阻器、SPD防雷芯片、智能过压保护器等核心电子元件的研发与生产。公司创始人凭借对电子行业发展趋势的精准判断,以及对技术创新的执着追求,成功研发出了一系列具有竞争力的产品。这些产品不仅满足了当时市场的需求,也为德欣公司在电子行业打下了坚实的基础。

问答坊 | AI 解惑

Altium(Protel) 公司出“年报预告”信息了

根据Altium(Protel) 公司在2010年7月12日向悉尼证交所提交的2010年年报预告信息,该公司2009年7月1日至2010年6月30日止,预计共完成销售额是4650万美元,同比下降9% 。 在大中国地区(包括台湾和香港),预计共完成销售额是440万美元,同比下降43% ...…

查看全部问答>

关于在U-boot中添加命令的问题

  大家好,小弟现在正在学习嵌入式这一块,最近看到U-Boot,现在希望能在其中添加一条自己的命令,可是却遇到了这样的问题。   小弟所用的版本是1.3.3,算是比较新的版本。基本上是依照网上介绍的做法来添加的。可是把u-boot ...…

查看全部问答>

求助:网卡全双工/半双工概念问题

请问各位,网卡的全双工/半双工是对MAC而言还是对PHY说的啊,我现在的项目是MAC+PHY结构,自己看资料,发现设置全双工半双工是在PHY芯片上,但是看MAC的工作原理是,全双工半双工控制着MAC的发送流程,看资料上说的是半双工的时候,MAC发送数据要检 ...…

查看全部问答>

求职嵌入式开发

小弟经过2道笔试面试上华为的外包公司文思,虽然也是linux开发有4.75K,但是我真的特别爱好嵌入式,工资比这个低也不介意,不想到时候 又花时间转嵌入式,一次到位算了,想做这个好久了,自己都有些基础 例如操作系统原理,信号,进程,IPC 多线程 ...…

查看全部问答>

SD卡注册表存储

2440 WinCE5.0 目前已实现Flash注册表Hive存储,现在希望存储在SD卡中 存储在Flash中时的注册表是: [HKEY_LOCAL_MACHINE\\System\\StorageManager\\AutoLoad\\MSFlash]     \"DriverPath\"=\"Drivers\\\\BuiltIn\\\\MSFlash\" &nbs ...…

查看全部问答>

请教关于vxworks下位域定义及操作的问题

我的系统是2410+vxworks,最近有个应用问题想使用位域来解决,我定义了如下结构体: typedef union {     struct     {         unsigned char Type   : 3;    &nbs ...…

查看全部问答>

想调用平均值函数

#include <msp430g2231.h>#include <intrinsics.h>   long volMeasured[8];unsigned char volMeasuredPosition = 0;long volAverage;   //  定义一个求平均值函数long Measured[8];long Average(long Measured[8]){&nbs ...…

查看全部问答>

一个开关电源电路图的分析

一个开关电源电路图的分析,+310V电压经过1R1,1R2,稳压二极管1D1(防止栅极因电压过高击穿)给开关管G12栅极提供电压,使其导通,G12导通后,变压器初级56对地导通,+310V给变压器充电,由于电感对初级电流的阻碍作用,变压器上的电流从小到大,当 ...…

查看全部问答>

STM32F429开发板,你愿意DIY吗?

STM32F429的性能真好,很多人对其垂涎。在这里调查一下的目的是,如果响应的人多,愿意为大家做PCB。 …

查看全部问答>