




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PIC单片机的EEPROM读写程序PIC16C74B单片机与AT24C64通讯;该程序实现的功能是:;将I2C_A,I2C_B.I2C_K内容写入EEPROM中;同时在EEPROM中读出数据从新写入各个寄存器;=LISTP=16C74B#includeERRORLEVEL-302I2C_AEQU0X20I2C_BEQU0X21I2C_CEQU0X22I2C_DEQU0X23I2C_EEQU0X24I2C_FEQU0X25I2C_GEQU0X26REG1EQU0X2BREG2EQU0X2CCOUNTEQU0X71;I2CBCOUNTEQU0X72;I2CTXBUFEQU0X73;I2CRXBUFEQU0X74;I2CBUSCONEQU0X75;I2CBUSSTAEQU0X76;I2CI2CBUFEQU0X77;I2CSLAVEADDREQU0XA0;I2CDATAADDRHEQU0X01;I2CDATAADDRLEQU0X00;I2C;-;BUSCON;-SLAVE_RWEQU7LAST_BYTE_RXEQU6SLAVE_ACTIVEEQU5TIME_OUTEQU4;-;BUSSTA;-BUS_BUSYEQU7TX_PROGRESSEQU6RX_PROGRESSEQU5TX_SUCCESSEQU4RX_SUCCESSEQU3FATAL_ERROREQU2;SLAVEEEPROMABORTEQU1ACK_ERROREQU0;-R_NOT_WEQU0TRUEEQU1FALSEEQU0SDAEQU0X04;I2CSCLEQU0X03;I2C;=ORG0X00GOTOSTARTORG0X20STARTBCFSTATUS,RP1BCFSTATUS,RP0CLRFRACLRFRBCLRFRCCLRFRDCLRFREBSFSTATUS,RP0CLRFTRISACLRFTRISBCLRFTRISCCLRFTRISDCLRFTRISEMOVLW0X02MOVWFI2C_AMOVLW0X04MOVWFI2C_BMOVLW0X03MOVWFI2C_CMOVLW0X03MOVWFI2C_DMOVLW0X05MOVWFI2C_EMOVLW0X06MOVWFI2C_FMOVLW0X04MOVWFI2C_G;=START1CALLI2CBUS_INITCALLREGTOI2CBUFCALLI2CWRITECALLCLRI2CBUFCALLD10CALLI2CREADCALLI2CBUFTOREGGOTOSTART1;=;CLRI2CBUF;-CLRI2CBUFBCFSTATUS,RP0MOVLWI2CBUFMOVWFFSRMOVLW0X08MOVWFCOUNTCLRLOOPCLRFINDFINCFFSR,FDECFSZCOUNT,FGOTOCLRLOOPRETURN;-;将各个REGSTER数据写入I2CBUF缓冲区;-REGTOI2CBUFBCFSTATUS,RP0MOVLWI2CBUFMOVWFFSRMOVFI2C_A,WMOVWFINDFINCFFSR,FMOVFI2C_B,WMOVWFINDFINCFFSR,FMOVFI2C_C,WMOVWFINDFINCFFSR,FMOVFI2C_D,WMOVWFINDFINCFFSR,FMOVFI2C_E,WMOVWFINDFINCFFSR,FMOVFI2C_F,WMOVWFINDFINCFFSR,FMOVFI2C_G,WMOVWFINDFRETURN;-;将I2CBUF缓冲区数据写入各个REGSTER;-I2CBUFTOREGBCFSTATUS,RP0MOVLWI2CBUFMOVWFFSRMOVFINDF,WMOVWFI2C_AINCFFSR,FMOVFINDF,WMOVWFI2C_BINCFFSR,FMOVFINDF,WMOVWFI2C_CINCFFSR,FMOVFINDF,WMOVWFI2C_DINCFFSR,FMOVFINDF,WMOVWFI2C_EINCFFSR,FMOVFINDF,WMOVWFI2C_FINCFFSR,FMOVFINDF,WMOVWFI2C_GRETURN;=;将I2CBUF缓冲区内的数据写入EEPROM;=I2CWRITECALLI2CSTARTBTFSSBUSSTA,BUS_BUSYGOTOTX_FAILBCFBUSCON,SLAVE_RWCALLTX_SLAVE_ADDRBTFSSBUSSTA,TX_SUCCESS;SUCESSFULL?GOTOTX_FAILCALLTX_DATA_ADDRBTFSSBUSSTA,TX_SUCCESSGOTOTX_FAILMOVLWI2CBUFMOVWFFSRMOVLW07MOVWFCOUNTT_BYTE_LOOPMOVFINDF,WMOVWFTXBUFCALLI2CTXBBTFSSBUSSTA,TX_SUCCESSGOTOTX_FAILINCFFSR,FDECFSZCOUNT,FGOTOT_BYTE_LOOPGOTOTX_PASSTX_FAILCALLI2CSTOPBCFBUSSTA,TX_PROGRESSBCFBUSSTA,TX_SUCCESSRETLWFALSETX_PASSCALLI2CSTOPBCFBUSSTA,TX_PROGRESSRETLWTRUE;-;从EEPROM中读出数据到I2CBUF寄存器;-I2CREADBCFSTATUS,RP0BCFBUSSTA,RX_SUCCESSCALLI2CSTARTBTFSSBUSSTA,BUS_BUSYGOTORX_FAILBCFBUSCON,SLAVE_RWCALLTX_SLAVE_ADDRBTFSSBUSSTA,TX_SUCCESSGOTORX_FAILCALLTX_DATA_ADDRBTFSSBUSSTA,TX_SUCCESSGOTORX_FAILCALLI2CSTARTBSFBUSCON,SLAVE_RWCALLTX_SLAVE_ADDRBTFSSBUSSTA,TX_SUCCESSGOTORX_FAILBCFBUSSTA,LAST_BYTE_RXMOVLWI2CBUFMOVWFFSRMOVLW07MOVWFCOUNTR_BYTE_LOOPMOVLW0X01XORWFCOUNT,WBTFSCSTATUS,ZBSFBUSSTA,LAST_BYTE_RXCALLI2CRXBBTFSSBUSSTA,RX_SUCCESSGOTORX_FAILMOVFRXBUF,WMOVWFINDFINCFFSR,FDECFSZCOUNT,FGOTOR_BYTE_LOOPGOTORX_PASSRX_FAILCALLI2CSTOPBCFBUSSTA,RX_PROGRESSBCFBUSSTA,RX_SUCCESSRETLWFALSERX_PASSCALLI2CSTOPBCFSTATUS,RP0BCFBUSSTA,TX_PROGRESSBCFBUSSTA,RX_PROGRESSBSFBUSSTA,RX_SUCCESSRETLWTRUE;=;I2C初始化;=I2CBUS_INITBCFSTATUS,RP0MOVFRC,WANDLW0X18MOVWFRCCLRFBUSSTACLRFBUSCONRETURN;=;传送设备地址;入口:BUSCON;出口:BUSSTA;=TX_SLAVE_ADDRBCFSTATUS,RP0BCFBUSSTA,ACK_ERRORMOVLWSLAVEADDRMOVWFTXBUFBTFSCBUSCON,SLAVE_RWBSFTXBUF,R_NOT_WCALLI2CTXBBTFSCBUSSTA,TX_SUCCESSGOTOTXADDR_SUCCESSCLRWDTBTFSSBUSSTA,ACK_ERRORCALLI2CSTOPGOTOTXADDR_ENDTXADDR_SUCCESSCLRWDTTXADDR_ENDRETURN;=;TX_DATA_ADDR发送写/读的地址;=TX_DATA_ADDRBCFSTATUS,RP0MOVLWDATAADDRHMOVWFTXBUFCALLI2CTXBBCFSTATUS,RP0BTFSSBUSSTA,TX_SUCCESSGOTOTX_DATA_ADDR_ERRORMOVLWDATAADDRLMOVWFTXBUFCALLI2CTXBBCFSTATUS,RP0BTFSSBUSSTA,TX_SUCCESSGOTOTX_DATA_ADDR_ERRORGOTOTX_DATA_ENDTX_DATA_ADDR_ERRORBCFBUSSTA,TX_PROGRESSBCFBUSSTA,TX_SUCCESSBSFBUSSTA,ACK_ERRORTX_DATA_ENDRETURN;=;向EEPROM输出一个8位数据,并检测EEPROM的ACK信号;入口:TXBUF寄存器;BUSSTA寄存器;出口:EEPROM存储器;BUSSTA寄存器;=I2CTXBBCFSTATUS,RP0BSFBUSSTA,TX_PROGRESSBCFBUSSTA,TX_SUCCESSMOVLW0X08MOVWFBCOUNTTXLOOPCLRWDTBSFSTATUS,RP0BCFTRISC,SCLNOPBCFTRISC,SDABCFSTATUS,RP0RLFTXBUF,FBSFSTATUS,RP0BTFSCSTATUS,CBSFTRISC,SDANOPBSFTRISC,SCLNOPNOPBCFSTATUS,RP0DECFSZBCOUNT,FGOTOTXLOOP;-;检测是EEPROM否有ACK信号产生,产生为正常;检测方法:;1.将RC口的SCL.SDA分别设置为输出和输入状态;2.延时2个指令周期,将SCL设置为高电平;3.延时2个指令周期,检测RC口SDA的状态;4.如果为高电平,设置错误状态,返回;5.如果为低电平,延时2个指令周期后,将RC口SCL设置为低电平,继续执行;-BSFSTATUS,RP0BCFTRISC,SCLBSFTRISC,SDANOPNOPBSFTRISC,SCLNOPBCFSTATUS,RP0BTFSCRC,SDAGOTOTX_ERRBSFSTATUS,RP0BCFTRISC,SCLBCFSTATUS,RP0BCFBUSSTA,TX_PROGRESSBSFBUSSTA,TX_SUCCESSBCFBUSSTA,ACK_ERRORGOTOTX_ENDTX_ERRBCFBUSSTA,TX_PROGRESSBCFBUSSTA,TX_SUCCESSBSFBUSSTA,ACK_ERRORTX_ENDRETURN;=;从EEPROM中读出8位的数据,并发送发送ACK信号;入口:EEPROM存储器;BUSCON寄存器;出口:RXBUF寄存器;BUSSTA寄存器;=I2CRXBBCFSTATUS,RP0BSFBUSSTA,RX_PROGRESSBCFBUSSTA,RX_SUCCESSMOVLW0X08MOVWFBCOUNTRXLOOPCLRWDTBSFSTATUS,RP0BCFTRISC,SCL;定义TRISC为输出BSFTRISC,SDA;定义TRISC为输入NOPNOPBSFTRISC,SCL;TRISC输出高电平NOPBCFSTATUS,RP0BCFSTATUS,CBTFSCRC,SDA;原指令为BTFSCTRISC,SDABSFSTATUS,CRLFRXBUF,FDECFSZBCOUNT,FGOTORXLOOP;-;发送ACK信号到EEPROM;判断接收的是否为最后一个字节;LAST_BYTE_RX为1,是SDA发送一个高电平,结束;LAST_BYTE_RX为0,不是SDA发送一个低电平ACK,继续接收;-BSFSTATUS,RP0BCFTRISC,SCLBCFTRISC,SDABTFSCBUSCON,LAST_BYTE_RX;检测是否是最后一个字节BSFTRISC,SDA;是最后一个字节NOP;发送ACK信号BSFTRISC,SCLNOPNOPNOPNOPBCFTRISC,SCLBCFSTATUS,RP0BCFBUSSTA,RX_PROGRESSBSFBUSSTA,RX_SUCCESSRETURN;=;I2C开始信号;输入:无;输出:BUFSSTA;=I2CSTARTBSFSTATUS,RP0BSFTRISC,SDA;1USNOP;1USBSFTRISC,SCL;1USNOPNOPBCFTRISC,SDANOPNOPBCFSTATUS,RP0BSFBUSSTA,BUS_BUSYRETURN;=;I2C结束信号;输入:无;输出:BUSSTA;=I2CSTOPBSFSTATUS,RP0BCFTRISC,SCLBCFTRISC,SDABSFTRISC,SCLNOPNOPBSFTRISC,SDANOPBCFSTATUS,RP0BCFBUSSTA,BUS_BUSYRETURN;=;D10;clockin4Mhz;delay10ms;=D10MOVLW0X0DMOVWFREG1LOOP2MOVLW0XFFMOVWFREG2LOOP1DECFSZREG2,fGOTOLOOP1DECFSZREG1,fGOTOLOOP2RETURN;=I2CERRCLRWDTNOPNOPNOPRETURNEND硬件I2C的主模式,只能在具有MSSP模块的单片机里实现,如PIC16F87X,而PIC16C7X的SSP只能启用I2C从模式。我个人不太喜欢用硬件I2C,因为我觉得硬件I2C不能节省多少代码,而且要设置的地方多了些,其实主要原因还是用IO口模拟的软件方式用得熟了,所以,通常也就偷懒了,呵呵!硬件主I2C较之用IO口软件模拟的I2C,硬件的波特率固定,速度也快些,但设置较显烦琐,调起来可能不如用惯了的软件方式来得快。这是我个人的想法,不是叫大家不要去用,改天我贴一个硬件I2C的例程上来大家看看。我这里有一种主器件在I2C总线上检测从器件的方法,不知道是不是理想的,望各位大虾探讨。开始-从地址-应答-停止(表示有从器件)|不应答-停止(表示无从器件,或从器件忙)SSP状态寄存器SSPSTATRRRRRRD/APSR/WUABF地址:94h上电值:00h缓冲区满接收(SPI和I2C模式)1=接收完成,SSPBUF满0=接收未完成,SSPBUF空发送(I2C模式)1=发送正在进行,SSPBUF满0=发送已经完成,SSPBUF空地址更新(10位I2C从属模式)1=通知用户更新SSPADD中的地址0=地址尚不需更新读/写信息位(I2C模式),该位记录I2C的读/写状态。用户需用这个位来判断发送和接收状态。1=读0=写起始位(I2C模式)1=I2C线上检测到起始位0=I2C线上未检测到起始位停止位(I2C模式)1=I2C线上检测到停止位0=I2C线上未检测到停止位数据/地址位(I2C模式)1=最后收到的字
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 天津铁道职业技术学院《影像诊断学一》2023-2024学年第二学期期末试卷
- 华科大电站锅炉原理课件00绪论
- 青岛农业大学《循证医学与META分析》2023-2024学年第二学期期末试卷
- 四川科技职业学院《新媒体项目课程一》2023-2024学年第二学期期末试卷
- 河北资源环境职业技术学院《生产物流管理》2023-2024学年第二学期期末试卷
- 长春职业技术学院《马克思主义基本原理理论》2023-2024学年第二学期期末试卷
- 2025年执业药师资格证之《西药学专业一》预测试题附答案详解【完整版】
- 2025年执业药师资格证之《西药学专业二》通关提分题库及参考答案详解(综合卷)
- 2025年执业药师资格证之《西药学专业一》基础试题库含答案详解(完整版)
- 南京交通职业技术学院《数字影像合成》2023-2024学年第二学期期末试卷
- 多功能呼吸机项目安全风险评价报告
- 2025年法律硕士入学考试试题及答案
- GB 35181-2025重大火灾隐患判定规则
- 2024年贵州省普通高校招生信息表(普通类本科批-物理组合)
- GB/T 44570-2024塑料制品聚碳酸酯板材
- 中国保险行业协会官方-2023年度商业健康保险经营数据分析报告-2024年3月
- 小学高段语文审题能力的培养
- 护理人文关怀质量评价标准
- 【北师大版】七年级上册数学 第四章 图形的全等 单元检测(含答案)
- 《教育学原理》期末考试试卷试题A及答案
- 陈倍生妙派风水秘诀笔记
评论
0/150
提交评论