历史上的今天
返回首页

历史上的今天

今天是:2025年01月08日(星期三)

正在发生

2020年01月08日 | PIC单片机的AT24C64通讯设计

2020-01-08 来源:eefocus

该程序实现的功能是:

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


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

PIC单片机的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

BSFSTATUS,C

RLFRXBUF,F

DECFSZBCOUNT,F

GOTORXLOOP

;---------------------------------------

;发送ACK信号到EEPROM

;判断接收的是否为最后一个字节

;LAST_BYTE_RX为1,是SDA发送一个高电平,结束

;LAST_BYTE_RX为0,不是SDA发送一个低电平ACK,继续接收

;---------------------------------------

BSFSTATUS,RP0

BCFTRISC,SCL

BCFTRISC,SDA

BTFSCBUSCON,LAST_BYTE_RX;检测是否是最后一个字节

BSFTRISC,SDA;是最后一个字节

NOP;发送ACK信号

BSFTRISC,SCL

NOP

NOP

NOP

NOP

BCFTRISC,SCL

BCFSTATUS,RP0

BCFBUSSTA,RX_PROGRESS

BSFBUSSTA,RX_SUCCESS

RETURN

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

;I2C开始信号

;输入:无

;输出:BUFSSTA

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

I2CSTART

BSFSTATUS,RP0

BSFTRISC,SDA;1US

NOP;1US

BSFTRISC,SCL;1US

NOP

NOP

BCFTRISC,SDA

NOP

NOP

BCFSTATUS,RP0

BSFBUSSTA,BUS_BUSY

RETURN

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

;I2C结束信号

;输入:无

;输出:BUSSTA

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

I2CSTOP

BSFSTATUS,RP0

BCFTRISC,SCL

BCFTRISC,SDA

BSFTRISC,SCL

NOP

NOP

BSFTRISC,SDA

NOP

BCFSTATUS,RP0

BCFBUSSTA,BUS_BUSY

RETURN

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

;D10@

;cLOCkin4MHz

;delay10ms

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

D10MOVLW0X0D

MOVWFREG1

LOOP2MOVLW0XFF

MOVWFREG2

LOOP1DECFSZREG2,f

GOTOLOOP1

DECFSZREG1,f

GOTOLOOP2

RETURN

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

I2CERRCLRWDT

NOP

NOP

NOP

RETURN

END

推荐阅读

史海拾趣

AIRPAX公司的发展小趣事

进入21世纪,AIRPAX开始积极拓展全球市场。通过与各国企业的合作与交流,AIRPAX的产品逐渐进入欧洲、亚洲等地区,服务于更多国家的客户。同时,AIRPAX还积极寻求与其他行业领先企业的战略合作,共同推动电气保护技术的发展。这些合作不仅提升了AIRPAX的品牌影响力,也为其带来了更多的商业机会。

AEM [ American Electronic Materials]公司的发展小趣事

AEM公司起源于美国,其创立之初便致力于电子元器件的研发与生产。在早期,AEM便以其独特的创新理念和先进的技术水平,迅速在电子元器件市场中崭露头角。公司通过不断的技术研发,成功开发出了一系列具有竞争力的电子元器件产品,如高性能的电阻器、电容器等,这些产品广泛应用于通信设备、计算机、消费电子等多个领域。

随着技术的不断进步,AEM逐渐积累了丰富的经验和专业知识,其产品在市场上得到了广泛的认可。同时,AEM还积极拓展海外市场,将产品出口到全球多个国家和地区,进一步提升了公司的国际影响力。

芯源半导体(CW)公司的发展小趣事

为了进一步提升公司的竞争力,芯源半导体(CW)公司开始实施国际化战略。公司积极拓展海外市场,参加国际展会和论坛,与国际同行进行交流与合作。同时,公司还设立了海外研发中心,引进国际优秀人才和技术资源,以加强公司的研发实力和市场竞争力。这些举措使芯源半导体(CW)公司在国际市场上逐渐崭露头角。

峰岹(Fortior Tech )公司的发展小趣事

为了进一步提升公司的竞争力,芯源半导体(CW)公司开始实施国际化战略。公司积极拓展海外市场,参加国际展会和论坛,与国际同行进行交流与合作。同时,公司还设立了海外研发中心,引进国际优秀人才和技术资源,以加强公司的研发实力和市场竞争力。这些举措使芯源半导体(CW)公司在国际市场上逐渐崭露头角。

GainSpan ( Telit)公司的发展小趣事

风华的故事始于1984年,当时广东肇庆风华电子厂成立,最初业务聚焦于收录机装配。一年后,即1985年,国内首条从美国引进的年产1亿只片式多层陶瓷电容器生产线落户风华,标志着公司正式踏入高新技术产业领域。这一举措不仅提升了公司的技术实力,也为后续的发展奠定了坚实基础。

DATATRONICS公司的发展小趣事

DATATRONICS公司自成立以来,一直致力于电子技术的研发与创新。某年,公司研发团队成功突破了一项关键技术瓶颈,开发出了一款高效能的数据处理芯片。这款芯片以其卓越的性能和稳定性,迅速获得了市场的认可。DATATRONICS借此机会,进一步扩大了产品线,提高了市场竞争力。

问答坊 | AI 解惑

DS18B20 测温程序完全解读

硬件: 51板     (1)单线ds18b20接 P2.2     (2)使用外部电源给ds18b20供电,没有使用寄生电源奥 软件:      Kei uVision 2     刚开始对时序把握不好,可是在论坛里没找到比较详细的解释 ...…

查看全部问答>

几个关于嵌入式存储器的资料分享,涉及FLASH,ROM,RAM,NOR,NAND等概念

几个关于嵌入式存储器的资料分享,涉及FLASH,ROM,RAM,NOR,NAND等概念!…

查看全部问答>

arm300综合实验运行不了

不知道为什么,下载的电子菜单程序能编译,却没有运行,出现12x12 font file is not found!16x16 font file is not found! config.sys no found ,不知道怎么解决此问题…

查看全部问答>

modelsim中,添加库时遇到的问题“Could not find synplify.attributes.”

我在modelsim中添加altera_mf 库,可提示需要Synplify库,于是我到Synplify中找到synplify.vhd文件编译,最后再次编译Altera_mf库提示:Could not find synplify.attributes. 那位高手遇到过这个问题啊??…

查看全部问答>

100求助各位高手:关于串口收发程序!

EVC下串口通信原程序如下: /********************************** 函数名称: OpenPort 描    述: 打开串口 输入参数: LPCTSTR Port: 串口名,如\"COM0:\",\"COM1:\"                  ...…

查看全部问答>

WINCE下怎么把控制面板程序调出来

  WINCE下怎么把控制面板程序调出来   如在windows可以用如下的API调用控制面板中的\"日期/时间\"设置程序:      winexe(\"rundll32.exe   shell32.dll,Control_RunDLL   timeda ...…

查看全部问答>

怎么让Acticesync支持UDP?

本人做GPS车载终端,有了Acticesync就可以单步调试,可惜只能调试TCP的协议,对于UDP的没有办法调试,因为听说Acticesync不支持啊? 想问问个位高手: 1. 强悍的微软做出来的Acticesync难道真的就不支持UDP吗?????? 2. 如果不支持,怎么才能让它支持…

查看全部问答>

stm32学习(1)--SysTick

1. systick介绍 Systick 就是一个定时器而已,只是它放在了NVIC 中,主要的目的是为了 给操作系统提供一个硬件上的中断(号称滴答中断)。没有学过操作系统的同学, 可能会很郁闷,啥叫滴答中断?这里来简单地解释一下。操作系统进 ...…

查看全部问答>

想买个LM3S9B96板子,大约多少钱啊?

想买个LM3S9B96板子,大约多少钱啊?…

查看全部问答>

怎么用D触发器实现延时???

一个D触发器延时一个CLK周期,如果延时10个CLK周期 就是多打几拍,程序该怎么写? 一个D触发器的程序 reg  A_ZRE0_CROSS_MOVE;always @(posedge CLK_1K or negedge Rst)//延迟1个时钟的D触发器 &nb ...…

查看全部问答>