📄 24c04.asm
字号:
list p=16c73
include"sx3200.inc"
org 0000h
;子程序文件名:write_eeprom(loca8在bank0,1)
;实现功能:带crc写外部数据ee(24c0x)子程序
;版本:
;作者:
;日期:
;测试人员:
;测试日期:
;测试文件:
;修改说明:
;程序所属区块:page0
;入口参数:
; loca5------------------>要写的数据e2prom页地址
; loca6------------------>要写的数据e2prom页内地址(为0)
; loca7------------------>要写的数据个数(不包括crc)
; loca8------------------>要写的数据存放的ram首地址
; rp0=rp1=0
;出口参数:
; logic_status------------> 1 fail; 0 success
; rp0=rp1=irp=0
;影响的局部寄存器:loca0~loca4,loca9,ee_buffer
;影响的全局寄存器:io_data,io_addr
;堆栈深度:3级
;执行时间:写16字节8.3ms+7.7ms;写6字节3.3ms+7.7ms
;调用的程序:crcgenerator(1),copydata(1),iic_writedata(2),iic_readdata(2),comparedata(1)
;特殊说明:loca5~loca8保持不变;写n字节数据,将写n+2字节,自动加上2字节crc;页内地址固定为0
;=============================================================================================
write_eeprom:
bcf intcon,gie
btfsc intcon,gie
goto $-2
bsf logic_status
movf loca5,w
sublw .31 ;512字节的数据ee,即32页(32*16byte)
btfss status,c
return
movf loca7,w
sublw .14 ;最大写的数据长度为14字节(不包括才crc)
btfss status,c
return
movlw repeat_count
movwf loca9
movf loca8,w
movwf loca0
movlw ee_buffer
movwf loca1
movf loca7,w
call copydata ;复制要写的数据到ee_buffer
movf loca7,w
movwf loca0 ;计算长度
movlw ee_buffer
movwf fsr
call crcgenerator ;计算crc
movf loca1,w
movwf indf
incf fsr,f
movf loca2,w
movwf indf
write_eeprom_again:
call iic_writedata ;把ee_buffer里的数据写到24c04
btfsc status,c
goto write_eeprom_error
movlw .10 ;写延时,数据ee的写大约5ms
movwf loca0
clrf loca1
decfsz loca1,f
goto $-1 ;256×3=768us
decfsz loca0,f
goto $-4 ;(768+4)*10=7.7ms
call iic_readdata ;读24c04里的数据到ee_buffer+10h
btfsc status,c
goto write_eeprom_error
movlw ee_buffer
movwf loca0
movlw ee_buffer+10h
movwf loca1
movf loca7,w
addlw 02h
call comparedata ;比较数据
btfss status,z
goto write_eeprom_error
bcf logic_status
bsf intcon,gie
return
write_eeprom_error:
decfsz loca9,f
goto write_eeprom_again
bsf intcon,gie
return
;=============================================================================================
;子程序文件名:read_eerpom(loca8在bank0,1)
;实现功能:带crc读外部数据ee(24c0x)子程序
;版本:
;作者:
;日期:
;测试人员:
;测试日期:
;测试文件:
;修改说明:
;程序所属区块:page0
;入口参数:
; loca5------------------->要读的数据e2prom页地址
; loca6------------------->要读的数据e2prom页内地址(为0)
; loca7------------------->要读的数据个数(不包括crc)
; loca8------------------->读出的数据存放的ram首地址
; rp0=rp1=0
;出口参数:
; logic_status------------> 1 fail; 0 success
; rp0=rp1=irp=0
;影响的局部寄存器:loca0~loca4,loca9,ee_buffer
;影响的通用寄存器:io_data,io_addr,loca8指向的n字节的数据
;堆栈深度:3级
;执行时间:读16字节8.9ms
;调用的程序:crcgenerator(1),copydata(1),iic_readdata(2),comparedata(1)
;特殊说明:loca5~loca8保持不变,读n字节,将返回n+2字节,即使该页的crc错误也会把错误的crc读出;页内地址固定为0
;=============================================================================================
read_eeprom:
;bcf intcon,gie
;btfsc intcon,gie
;goto $-2
bsf logic_status
movf loca5,w
sublw .31 ;512字节的数据ee,即32页(32*16byte)
btfss status,c
return
movf loca7,w
sublw .14 ;最大读的数据长度为14字节(不包括才crc)
btfss status,c
return
movlw repeat_count
movwf loca9
read_eeprom_again:
call iic_readdata ;读24c04里的数据到ee_buffer+10h
movlw ee_buffer+10h
movwf loca0
movlw ee_buffer
movwf loca1
movf loca7,w
addlw 02h
call copydata ;复制到ee_buffer
movlw ee_buffer+10h
movwf loca0
movf loca8,w
movwf loca1
movf loca7,w
addlw 02h
call copydata ;再复制到ram数据区,不管对错
call iic_readdata ;再次读24c04里的数据到ee_buffer+10h
btfsc status,c
goto read_eeprom_error
movlw ee_buffer+10h
movwf loca0
movlw ee_buffer
movwf loca1
movf loca7,w
addlw 02h
call comparedata ;比较数据
btfss status,z
goto read_eeprom_error
movf loca7,w
addlw 02h
movwf loca0 ;计算长度
movlw ee_buffer ;必须是ee_buffer,不能是ee_buffer+10h,否则在计算16字节crc时回溢出
movwf fsr
call crcgenerator ;计算crc
movf loca1,w
btfss status,z
goto read_eeprom_error
movf loca2,w
btfss status,z
goto read_eeprom_error
bcf logic_status
;bsf intcon,gie
return
read_eeprom_error:
decfsz loca9,f ;错误次数减1
goto read_eeprom_again
;bsf intcon,gie
return
;=======================================================================================
;子程序文件名:iic_writedata
;实现功能: 把ee_buffer里的数据写道24c0x里面
;版本:
;编写人:
;编写日期:
;测试人:
;测试通过日期:
;测试文件:
;更改记录:
;程序所属区块:page0
;入口参数:loca5---页地址
; loca7---字节数
; rp0=rp1=irp=0
;出口参数:rp0=rp1=irp=0
;影响的局部寄存器:loca0~loca4
;影响的通用寄存器:
;堆栈深度:2级
;执行时间:(0.5+0.18*n)ms,写16字节需要3.38ms,写3次需要10ms
;调用的程序:get_wordaddress(1),iic_start(1),iic_dataout(1),iic_stop(1)
;特殊说明:改变电平在时钟的低电平,读电平在时钟的高电平;空闲的时候sda为高(输入),scl为高(始终输出)
;========================================================================================
iic_writedata:
bsf status,rp0
bcf port_wp
bcf status,rp0
call iic_delay
bcf port_wp
movlw repeat_count
movwf loca4 ;写错误最大次数
movf loca5,w
call get_wordaddress
movwf loca3 ;暂存字节地址
iic_write_again:
movf loca7,w
addlw 02h
movwf loca2 ;需要写的字节数
call iic_start ;iic总线上产生起始位
movlw b'10100000'
btfsc loca5,4
movlw b'10100010'
call iic_dataout ;发送设备号+写
btfsc status,c
goto iic_write_error
movf loca3,w
call iic_dataout ;发送字节地址
btfsc status,c
goto iic_write_error
movlw ee_buffer
movwf fsr
iic_writedata_loop:
movf indf,w
call iic_dataout ;发送当前字节
btfsc status,c
goto iic_write_error
incf fsr,f
decfsz loca2,f
goto iic_writedata_loop
call iic_stop ;iic总线上产生停止位
bcf status,c
return
iic_write_error:
call iic_stop ;iic总线上产生停止位
decfsz loca4,f
goto iic_write_again
bsf status,c
return
;=======================================================================================
;子程序文件名:iic_readdata
;实现功能: 读24c0x里的数据到ee_buffer+10h
;版本: 1.0
;编写人:
;编写日期:
;测试人:
;测试通过日期:
;测试文件:
;更改记录:
;程序所属区块:page0
;入口参数:loca5---页地址
; loca7---字节数
; rp0=rp1=irp=0
;出口参数:rp0=rp1=irp=0
;影响的局部寄存器:loca0~loca4
;影响的通用寄存器:
;堆栈深度:2级
;执行时间:(0.5+0.19*n)ms,读16字节需要3.54,读3次需要11ms
;调用的程序:set_ram(1),get_wordaddress(1),iic_start(1),iic_datain(1),iic_stop(1),iic_ackout(1),ic_nackout(1)
;特殊说明:
;========================================================================================
iic_readdata:
bsf status,rp0
bcf port_wp
bcf status,rp0
call iic_delay
bsf port_wp
movlw ee_buffer+10h
movwf fsr
movlw .16
call set_ram ;先把缓存区里的数据设置成0ffh
movlw repeat_count
movwf loca4 ;读错误最大次数
movf loca5,w
call get_wordaddress ;影响loca0~loca1
movwf loca3 ;暂存字节地址
iic_read_again:
movf loca7,w
addlw 02h
movwf loca2 ;需要写的字节数
call iic_start ;iic总线上产生起始位
movlw b'10100000'
btfsc loca5,4
movlw b'10100010'
call iic_dataout ;发送设备号+写
btfsc status,c
goto iic_read_error
movf loca3,w
call iic_dataout ;发送字节地址
btfsc status,c
goto iic_read_error
call iic_restart ;产生重复起始位
movlw b'10100001'
btfsc loca5,4
movlw b'10100011'
call iic_dataout ;发送设备号+读
btfsc status,c
goto iic_read_error
movlw ee_buffer+10h
movwf fsr
iic_readdata_loop:
call iic_datain
movf loca0,w
movwf indf
incf fsr,f
movlw .1
subwf loca2,w
btfss status,z
call iic_ackout ;主器件发出应答位
decfsz loca2,f
goto iic_readdata_loop
call iic_nackout ;主器件发出非应答位
call iic_stop
bcf status,c
return
iic_read_error:
call iic_stop
decfsz loca4,f
goto iic_read_again
bsf status,c
return
;==========================================================================
iic_start:;iic总线上产生起始位
bsf status,rp0
bcf port_sda ;设置为输出方式
bcf port_scl
bcf status,rp0
call iic_delay
bsf port_sda
call iic_delay
bsf port_scl
call iic_delay ;起始位启动和保持为6个周期
bcf port_sda ;scl=1时sda由1变成0,起始位产生
call iic_delay
bcf port_scl
return ;起始位结束返回
;==========================================================================
iic_restart:;iic总线上产生重复起始位
bsf status,rp0
bcf port_sda ;设置为输出方式
bcf port_scl ;设置为输出方式
bcf status,rp0
call iic_delay
bcf port_scl
bsf port_sda ;在scl=0时sda=1,保证不出现停止位
call iic_delay
bsf port_scl
call iic_delay
bcf port_sda ;scl=1时sda由1变成0,重复起始位产生
call iic_delay
bcf port_scl ;时钟变为低电平
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -