该程序实现的功能是:
将i2c_a,i2c_b.。...i2c_k内容写入eeprom中
同时在eeprom中读出数据从新写入各个寄存器
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
研究所推一杯热水就能充电的保温杯
解析高压变频器的工作原理及应用
什么是点胶锡膏?
加州大学研发出RFID测力“贴纸”,重新定义精准测量
华为海思总裁何庭波 :撑起中国芯片的半边天
PIC单片机的AT24C64通讯设计
ST25R3916 -EMVCO创建支付终端非接触式系统
什么是智能家居背景音乐,在智能家居中有什么好处
多项政策鼓励发展风电项目,我国风能发电规模增速稳定
酶标仪该如何选择,它的产品特点是怎样的
路由器或成智能家居控制中心 受制标准不统一
国内PCB行业发展面临哪些挑战?
高管回应飞机上打华为卫星电话:不可违反规定
什么是MEMS硅麦克风,它更适用于TWS耳机的空间需求
浅谈PLC编程的字节寻址和字寻址
PD充电器插头跌落断裂问题有“新解”!亚洲充电展精彩回顾
传真机的类型
为什么单片机有不同位数?
电路板温升过高的解决办法
展望2013:莱迪思或致力进军安防、汽车和消费市场