SONIX单片机之I2C软件处理

[复制链接]
查看15285 | 回复14 | 2010-1-16 15:29:29 | 显示全部楼层 |阅读模式
;;***********************************
;;
;;程序功能:写字节数据,将要保存的数字写人到epprom中以防掉电丢失
;;调用子程序:start_i2c,stop_i2c,wrbyte,cack_i2c,
;;输入参数:epp_save
;;输出参数:epp_out***********************************************
;;
;;定义局部变量
.data
        i2i_buf_data        ds        1
        temp                ds        1
        flag3                ds        1
        f_f0                equ        flag3.0
;;--------------------------------------
.const
        sda                equ        fp51        ;;数据线
        sdam                equ        fp51m
        scl                equ        fp50        ;;时钟线
        sclm                equ        fp50m
;;---------------------------------------
.code        ;;程序入口
;;---------------------------------------
i2i_24c02:
        bts1        f_start_write                ;;
        jmp        i2i_24c02_90
        bclr        f_start_write
        b0bset        sdam
        b0bset        sclm
        call        delay_5us
;;-------------------------------------
write_24c02:
        call        start_i2i                ;;启动起始信号
        mov        a,#10100000b
        call        write_8bit                ;;写芯片代码
        call        check_ack                ;;读应答信号
        bts0        f_f0                        ;;是否有应答信号
        jmp        i2i_24c02_90
;;------------------------------------
        mov        a,#00                        ;;写起始数据
        call        write_8bit
        call        check_ack
        bts0        f_f0
        jmp        i2i_24c02_90
;;-------------------------------------
               
        mov        a,wk00                ;;数据1
        call        write_8bit
        call        check_ack
        bts0        f_f0
        jmp        i2i_24c02_90
;;-----------------------------
        mov        a,wk01                ;;数据2
        call        write_8bit
        call        check_ack
        bts0        f_f0
        jmp        i2i_24c02_90       
;;----------------------------
        mov        a,wk02                ;;数据3
        call        write_8bit
        call        check_ack
        bts0        f_f0
        jmp        i2i_24c02_90
;;----------------------------
        mov        a,wk03                ;;数据4
        call        write_8bit
        call        check_ack
        bts0        f_f0
        jmp        i2i_24c02_90
;;-----------------------------
        mov        a,b_key_mode        ;;数据5
        call        write_8bit
        call        check_ack
        bts0        f_f0
        jmp        i2i_24c02_90
        call        stop_i2i        ;;停止发送
i2i_24c02_90:
        ret
;;---------------------------------------
;;-------------------------------
;;以下为各个子模块程序
;;
;;
;;*******************************
delay_5us:
        jmp        $+1
        jmp        $+1
        jmp        $+1
        jmp        $+1
        jmp        $+1
        jmp        $+1
        jmp        $+1
        jmp        $+1
        jmp        $+1
        jmp        $+1
        ret
;;-------------------------------
;;--------------------------------
;;发起起始位
;;********************************
start_i2i:
        bset        sda
       
        bset        scl
        call        delay_5us
        bclr        sda
        call        delay_5us
        bclr        scl
        call        delay_5us
        ret
;;--------------------------------
;;----------------------------------
;;发送停止信号条件
;;*******************************
stop_i2i:
        bclr        sda
        bset        scl
        call        delay_5us
        bset        sda
        call        delay_5us
        bclr        scl
        ret
;;--------------------------------
ack_i2i:
        bclr        sda
        bset        scl       
        call        delay_5us
        bclr        scl
        ret
;;----------------------------------
;;-------------------------------
;;检查应答信号子程序,没有应答信号f_f0=1
;;-------------------------------;;
check_ack:
        bclr        sdam
        bset        sda
        bset        scl
        call        delay_5us
       
        bclr        f_f0
        bts0        sda
        jmp        check_ask10
        call        delay_5us
        bclr        scl
        jmp        check_ask20
check_ask10:
        call        delay_5us
        bset        f_f0                ;;无应答信号

        b0bclr        scl
check_ask20:
        bset        sdam
        nop
        bset        sda
        ret
;;---------------------------------
ask:
        call        delay_5us
        bclr        sda
        call        delay_5us
        bset        scl
        call        delay_5us
        bclr        scl
        call        delay_5us
        ret
;;
;;功能:发无确认信号
;;
;;---------------------------------

noask:
        bset        sda
        bset        scl
        call        delay_5us
        bclr        scl
        ret
;;----------------------------------
;;功能:写一个字节数据
;;input:i2i_buf_data,temp       
;;**********************************
write_8bit:
        mov        i2i_buf_data,a
        clr        temp
;;-------------------------------
write_8bit10:
        rlcm        i2i_buf_data
        bts1        fc
        jmp        write_8bit20
        bset        sda
        bset        scl
        call        delay_5us
        bclr        scl
        jmp        write_8bit30
write_8bit20:
        bclr        sda
        bset        scl
        call        delay_5us
        bclr        scl
write_8bit30:
        incms        temp
        cjb_        temp,#8,write_8bit10
        clr        temp
        ret
;--------------------------------
;;功能:读一个数据i2i_buf_data放到的数据
;;
;;*********************************
read_8bit:
        clr        i2i_buf_data        ;;
        clr        temp                ;;
       
       
read_8bit10:
        bclr        sdam
        call        delay_5us
        bset        scl
        call        delay_5us
        b0bclr        fc
        bts0        sda
        bset        fc
        rlcm        i2i_buf_data
        bclr        scl
        bset        sdam
       
        incms        temp
        cjb_        temp,#8,read_8bit10
        clr        temp
        ret
;;
;;----------------------------------;;
;;功能
;;开机时读取eeprom的值共4组数据
;;***********************************
read_24c02:
        call        start_i2i
        mov        a,#10100000b
        call        write_8bit
        call        check_ack
        bts0        f_f0
        ret
        mov        a,#00
        call        write_8bit
        call        check_ack
        bts0        f_f0
        ret
;;-----------------------------
read_ok:
        call        start_i2i
        mov        a,#10100001b
        call        write_8bit
        call        check_ack
        bts0        f_f0
        ret
;;--------------------------------
        ;;------------------------------
read_24c02_10:       
        call        read_8bit                        ;;读数据1
        call        ask
        mov_        i2i_data1,i2i_buf_data
;;--------------------------------
        call        read_8bit
        call        ask                                ;;读数据2
        mov_        i2i_data2,i2i_buf_data
;;--------------------------------
        call        read_8bit
        call        ask                                ;;读数据3
        mov_        i2i_data3,i2i_buf_data
;;--------------------------------
        call        read_8bit                        ;;数据4
        call        ask
        mov_        i2i_data5,i2i_buf_data
;;-------------------------------               
        call        read_8bit
        call        ask                                ;;读数据5
        mov_        i2i_data4,i2i_buf_data
;;----------------------------------------------
        call        stop_i2i       

        ret

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
275280780 | 2010-5-13 15:34:29 | 显示全部楼层
有从机程序就更好了
zhengjun7777 | 2010-5-17 18:12:26 | 显示全部楼层
好像有问题啊 放到我的板子上 不能写  读出来都是0
16mhz 2501
gwq168 | 2010-5-22 00:07:30 | 显示全部楼层
有朋友用SONIX SN8P2N117写过A/D的没有。在学习
FOUCES | 2010-6-14 19:54:18 | 显示全部楼层
学习...............
zhouchuan1452 | 2010-7-17 09:01:29 | 显示全部楼层
学习...............
lsmfr | 2010-7-17 09:09:09 | 显示全部楼层
我们都是互相学习嘛,如果大家有什么新的信息,或者有什么难题需要解决,都可以在论坛里回帖,我们的工程师们会想办法帮大家解决。
kodec2104 | 2010-7-20 14:11:40 | 显示全部楼层
我写过I2C 的程序,我是按要求写的,但是数据的发送出去后老是收不到应答信号,我很头疼,
lsmfr | 2010-7-21 09:30:30 | 显示全部楼层
你可以

1.查看硬件是否有问题?
2.时序是否正确?
lsmfr | 2010-7-21 09:34:57 | 显示全部楼层
补充上面的

1.        查看硬件是否有问题?

2.        时序是否正确?
3.        3.在读IO状态时,IO模式是否是输入模式?是否有上拉电阻?
4.        4.时钟信号是否正确?
你分析下看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则