您的位置 首页 新能源

PIC单片机的AT24C64通讯规划

PIC单片机的AT24C64通讯设计-该程序实现的功能是:

将I2C_A,I2C_B.。…I2C_K内容写入EEPROM中

同时在EEPROM中读出数据从新写入各个寄存器

该程序完成的功用是:

I2C_A,I2C_B.。…I2C_K内容写入EEPROM

一起在EEPROM中读出数据重新写入各个寄存器

P%&&&&&%单片机的AT24C64通讯规划
 

LISTP=16C74B

#include

ERRORLEVEL-302

I2C_AEQU0X20

I2C_BEQU0X21

I2C_CEQU0X22

I2C_DEQU0X23

I2C_EEQU0X24

I2C_FEQU0X25

I2C_GEQU0X26

REG1EQU0X2B

REG2EQU0X2C

COUNTEQU0X71;I2C

BCOUNTEQU0X72;I2C

TXBUFEQU0X73;I2C

RXBUFEQU0X74;I2C

BUSCONEQU0X75;I2C

BUSSTAEQU0X76;I2C

I2CBUFEQU0X77;I2C

SLAVEADDREQU0XA0;I2C

DATAADDRHEQU0X01;I2C

DATAADDRLEQU0X00;I2C

;—————————————

;BUSCON

;—————————————

SLAVE_RWEQU7

LAST_BYTE_RXEQU6

SLAVE_ACTIVEEQU5

TIME_OUTEQU4

;—————————————

;BUSSTA

;—————————————

BUS_BUSYEQU7

TX_PROGRESSEQU6

RX_PROGRESSEQU5

TX_SUCCESSEQU4

RX_SUCCESSEQU3

FATAL_ERROREQU2;SLAVEEEPROM

ABORTEQU1

ACK_ERROREQU0

;—————————————

R_NOT_WEQU0

TRUEEQU1

FALSEEQU0

SDAEQU0X04;I2C

SCLEQU0X03;I2C

;=======================================

ORG0X00

GOTOSTART

ORG0X20

STARTBCFSTATUS,RP1

BCFSTATUS,RP0

CLRFRA

CLRFRB

CLRFRC

CLRFRD

CLRFRE

BSFSTATUS,RP0

CLRFTRISA

CLRFTRISB

CLRFTRISC

CLRFTRISD

CLRFTRISE

MOVLW0X02

MOVWFI2C_A

MOVLW0X04

MOVWFI2C_B

MOVLW0X03

MOVWFI2C_C

MOVLW0X03

MOVWFI2C_D

MOVLW0X05

MOVWFI2C_E

MOVLW0X06

MOVWFI2C_F

MOVLW0X04

MOVWFI2C_G

;=======================================

START1

CALLI2CBUS_INIT

CALLREGTOI2CBUF

CALLI2CWRITE

CALLCLRI2CBUF

CALLD10

CALLI2CREAD

CALLI2CBUFTOREG

GOTOSTART1

;=======================================

;CLRI2CBUF

;—————————————

CLRI2CBUF

BCFSTATUS,RP0

MOVLWI2CBUF

MOVWFFSR

MOVLW0X08

MOVWFCOUNT

CLRLOOPCLRFINDF

INCFFSR,F

DECFSZCOUNT,F

GOTOCLRLOOP

RETURN

;—————————————

;将各个REGSTER数据写入I2CBUF缓冲区

;—————————————

REGTOI2CBUF

BCFSTATUS,RP0

MOVLWI2CBUF

MOVWFFSR

MOVFI2C_A,W

MOVWFINDF

INCFFSR,F

MOVFI2C_B,W

MOVWFINDF

INCFFSR,F

MOVFI2C_C,W

MOVWFINDF

INCFFSR,F

MOVFI2C_D,W

MOVWFINDF

INCFFSR,F

MOVFI2C_E,W

MOVWFINDF

INCFFSR,F

MOVFI2C_F,W

MOVWFINDF

INCFFSR,F

MOVFI2C_G,W

MOVWFINDF

RETURN

;—————————————

;将I2CBUF缓冲区数据写入各个REGSTER

;—————————————

I2CBUFTOREG

BCFSTATUS,RP0

MOVLWI2CBUF

MOVWFFSR

MOVFINDF,W

MOVWFI2C_A

INCFFSR,F

MOVFINDF,W

MOVWFI2C_B

INCFFSR,F

MOVFINDF,W

MOVWFI2C_C

INCFFSR,F

MOVFINDF,W

MOVWFI2C_D

INCFFSR,F

MOVFINDF,W

MOVWFI2C_E

INCFFSR,F

MOVFINDF,W

MOVWFI2C_F

INCFFSR,F

MOVFINDF,W

MOVWFI2C_G

RETURN

;=======================================

;将I2CBUF缓冲区内的数据写入EEPROM

;=======================================

I2CWRITE

CALLI2CSTART

BTFSSBUSSTA,BUS_BUSY

GOTOTX_FAIL

BCFBUSCON,SLAVE_RW

CALLTX_SLAVE_ADDR

BTFSSBUSSTA,TX_SUCCESS;SUCESSFULL?

GOTOTX_FAIL

CALLTX_DATA_ADDR

BTFSSBUSSTA,TX_SUCCESS

GOTOTX_FAIL

MOVLWI2CBUF

MOVWFFSR

MOVLW07

MOVWFCOUNT

T_BYTE_LOOP

MOVFINDF,W

MOVWFTXBUF

CALLI2CTXB

BTFSSBUSSTA,TX_SUCCESS

GOTOTX_FAIL

INCFFSR,F

DECFSZCOUNT,F

GOTOT_BYTE_LOOP

GOTOTX_PASS

TX_FAILCALLI2CSTOP

BCFBUSSTA,TX_PROGRESS

BCFBUSSTA,TX_SUCCESS

RETLWFALSE

TX_PASS

CALLI2CSTOP

BCFBUSSTA,TX_PROGRESS

RETLWTRUE

;—————————————

;从EEPROM中读出数据到I2CBUF寄存器

;—————————————

I2CREADBCFSTATUS,RP0

BCFBUSSTA,RX_SUCCESS

CALLI2CSTART

BTFSSBUSSTA,BUS_BUSY

GOTORX_FAIL

BCFBUSCON,SLAVE_RW

CALLTX_SLAVE_ADDR

BTFSSBUSSTA,TX_SUCCESS

GOTORX_FAIL

CALLTX_DATA_ADDR

BTFSSBUSSTA,TX_SUCCESS

GOTORX_FAIL

CALLI2CSTART

BSFBUSCON,SLAVE_RW

CALLTX_SLAVE_ADDR

BTFSSBUSSTA,TX_SUCCESS

GOTORX_FAIL

BCFBUSSTA,LAST_BYTE_RX

MOVLWI2CBUF

MOVWFFSR

MOVLW07

MOVWFCOUNT

R_BYTE_LOOP

MOVLW0X01

XORWFCOUNT,W

BTFSCSTATUS,Z

BSFBUSSTA,LAST_BYTE_RX

CALLI2CRXB

BTFSSBUSSTA,RX_SUCCESS

GOTORX_FAIL

MOVFRXBUF,W

MOVWFINDF

INCFFSR,F

DECFSZCOUNT,F

GOTOR_BYTE_LOOP

GOTORX_PASS

RX_FAILCALLI2CSTOP

BCFBUSSTA,RX_PROGRESS

BCFBUSSTA,RX_SUCCESS

RETLWFALSE

RX_PASSCALLI2CSTOP

BCFSTATUS,RP0

BCFBUSSTA,TX_PROGRESS

BCFBUSSTA,RX_PROGRESS

BSFBUSSTA,RX_SUCCESS

RETLWTRUE

;=======================================

;I2C初始化

;=======================================

I2CBUS_INIT

BCFSTATUS,RP0

MOVFRC,W

ANDLW0X18

MOVWFRC

CLRFBUSSTA

CLRFBUSCON

RETURN

;=======================================

;传送设备地址

;进口:BUSCON

;出口:BUSSTA

;=======================================

TX_SLAVE_ADDR

BCFSTATUS,RP0

BCFBUSSTA,ACK_ERROR

MOVLWSLAVEADDR

MOVWFTXBUF

BTFSCBUSCON,SLAVE_RW

BSFTXBUF,R_NOT_W

CALLI2CTXB

BTFSCBUSSTA,TX_SUCCESS

GOTOTXADDR_SUCCESS

CLRWDT

BTFSSBUSSTA,ACK_ERROR

CALLI2CSTOP

GOTOTXADDR_END

TXADDR_SUCCESS

CLRWDT

TXADDR_END

RETURN

;=======================================

;TX_DATA_ADDR发送写/读的地址

;=======================================

TX_DATA_ADDR

BCFSTATUS,RP0

MOVLWDATAADDRH

MOVWFTXBUF

CALLI2CTXB

BCFSTATUS,RP0

BTFSSBUSSTA,TX_SUCCESS

GOTOTX_DATA_ADDR_ERROR

MOVLWDATAADDRL

MOVWFTXBUF

CALLI2CTXB

BCFSTATUS,RP0

BTFSSBUSSTA,TX_SUCCESS

GOTOTX_DATA_ADDR_ERROR

GOTOTX_DATA_END

TX_DATA_ADDR_ERROR

BCFBUSSTA,TX_PROGRESS

BCFBUSSTA,TX_SUCCESS

BSFBUSSTA,ACK_ERROR

TX_DATA_END

RETURN

;=======================================

;向EEPROM输出一个8位数据,并检测EEPROM的ACK信号

;进口:TXBUF寄存器

;BUSSTA寄存器

;出口:EEPROM存储器

;BUSSTA寄存器

;======================================

I2CTXBBCFSTATUS,RP0

BSFBUSSTA,TX_PROGRESS

BCFBUSSTA,TX_SUCCESS

MOVLW0X08

MOVWFBCOUNT

TXLOOPCLRWDT

BSFSTATUS,RP0

BCFTRISC,SCL

NOP

BCFTRISC,SDA

BCFSTATUS,RP0

RLFTXBUF,F

BSFSTATUS,RP0

BTFSCSTATUS,C

BSFTRISC,SDA

NOP

BSFTRISC,SCL

NOP

NOP

BCFSTATUS,RP0

DECFSZBCOUNT,F

GOTOTXLOOP

;—————————————

;检测是EEPROM否有ACK信号发生,发生为正常

;检测办法:

;1.将RC口的SCL.SDA别离设置为输出和输入状况

;2.延时2个指令周期,将SCL设置为高电平

;3.延时2个指令周期,检测RC口SDA的状况

;4.假如为高电平,设置过错状况,回来

;5.假如为低电平,延时2个指令周期后,将RC口SCL设置为低电平,持续履行

;—————————————

BSFSTATUS,RP0

BCFTRISC,SCL

BSFTRISC,SDA

NOP

NOP

BSFTRISC,SCL

NOP

BCFSTATUS,RP0

BTFSCRC,SDA

GOTOTX_ERR

BSFSTATUS,RP0

BCFTRISC,SCL

BCFSTATUS,RP0

BCFBUSSTA,TX_PROGRESS

BSFBUSSTA,TX_SUCCESS

BCFBUSSTA,ACK_ERROR

GOTOTX_END

TX_ERRBCFBUSSTA,TX_PROGRESS

BCFBUSSTA,TX_SUCCESS

BSFBUSSTA,ACK_ERROR

TX_ENDRETURN

;=======================================

;从EEPROM中读出8位的数据,并发送发送ACK信号

;进口:EEPROM存储器

;BUSCON寄存器

;出口:RXBUF寄存器

;BUSSTA寄存器

;=======================================

I2CRXBBCFSTATUS,RP0

BSFBUSSTA,RX_PROGRESS

BCFBUSSTA,RX_SUCCESS

MOVLW0X08

MOVWFBCOUNT

RXLOOPCLRWDT

BSFSTATUS,RP0

BCFTRISC,SCL;界说TRISC为输出

BSFTRISC,SDA;界说TRISC为输入

NOP

NOP

BSFTRISC,SCL;TRISC输出高电平

NOP

BCFSTATUS,RP0

BCFSTATUS,C

BTFSCRC,SDA;原指令为BTFSCTRISC,SDA

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/xinnengyuan/346270.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部