登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

请问张工

作者:shaoguang 栏目:单片机
请问张工
张工你好:你书上的关于I2C通讯程序范例,都是通过验证的吗?特别是PIC单片机通过I2C通讯,的硬件主模式程序,
我调试没通过呀!!
我想请教一下用I2C时是采用硬件方式好调试那,还是用软件模拟I2C方式好那?
我在一个板子里用两片PIC16F877A采用I2C方式通讯,一个采用主模式,另一个采用中断从模式.
请张工给个调试过的例子,多谢!!!

2楼: >>参与讨论
xieyuanbin
这是我两年前的发送例程,调试通过。
;这是一个由16F87X硬件I2C主模式向地址为76H的从设备SAA1064发送若干字节的源程序,
;发送的字节数包括从设备地址存在COUNTI2C中,发送时从BUFADD开始依次读取COUNTI2C个字节并发送.
;从设备为SAA1064T四LED八段数码管显示控制器,子地址从00H开始,每写入一个字节地址自动增1.
;硬件主模式中,发送/接收时使用SSPADD作为波特率发生器的基数,SCL的频率为 晶体振荡频率/(4*(sspadd+1))
;本程序主要部分在PIC16F872向SSA1064芯片发送数据通讯中运行通过,
         LIST    P=PIC16F872
        INCLUDE "P16F872.INC"
CBLOCK  20H
BUFADD        ;从地址,76
BUFSADD        ;从设备子地址00开始
BUFCOM        ;子地址为00H的控制字节
BUFDIS1        ;数据1
BUFDIS2        ;数据2
COUNTI2C    ;发送字节计数器
ENDC
    ORG    0x0000
    GOTO    START
START
    BSF    STATUS,RP0    ;BANK1
    MOVLW    B'11000'
    MOVWF    TRISC        ;设置SCL,SDA为输入
    MOVLW    H'9'
    MOVWF    SSPADD        ;设置波特率发生器的波特率基数,频率=1M/(SSPADD+1)(晶振为4M)
    BCF    STATUS,RP0    ;BANK0
    CLRF    PORTC
    MOVLW    B'101000'    ;开MSSP模块,设置I2C为主控模式.SCL频率为 振荡频率/(4*(sspadd+1)).这里约为100KHZ
    MOVWF    SSPCON
    MOVLW    H'76'
    MOVWF    BUFADD        ;将从设备地址76H存入
    CLRF    BUFSADD        ;从 从设备子地址为00开始写入
    MOVLW    B'11000'    ;将从设备控制字节写入
    MOVWF    BUFCOM
    MOVLW    H'30'
    MOVWF    BUFDIS1
    MOVLW    H'4F'
    MOVWF    BUFDIS2        ;向从设备写入的数据.
    MOVLW    H'5'
    MOVWF    COUNTI2C    ;设置写入字节数为5个.
    CALL    SENDDATA    ;调用发送数据子程序.
    GOTO    START        ;返回.
;-----------------------------------------------------------------------------------
SENDDATA            ;主模式传送开始
    MOVLW    BUFADD        ;将第一个字节的地址存入FSR
    MOVWF    FSR
    BCF    PIR1,SSPIF    ;清中断标志.
    BSF    STATUS,RP0    ;BANK1
    BSF    SSPCON2,SEN    ;发送START条件.
    BCF    STATUS,RP0    ;BANK0
TESTSTART
    BTFSS    PIR1,SSPIF    ;查询SSPIF中断标志,看是否收到START条件,也可在中断中查询.
    GOTO    TESTSTART
    BCF    PIR1,SSPIF    ;清中断标志.
LOOPSEND
    MOVF    INDF,0        ;将FSR所指向的寄存器中的内容存入发送/接收缓存SSPBUF
    MOVWF    SSPBUF
TESTASK
    BTFSS    PIR1,SSPIF    ;1字节发送完成否?这里采用中断标志查询方式,也可使用中断方式;
    GOTO    TESTASK        ;这期间MCU通过SSPSR寄存器自动向SDA(PORTC,4)逐位发送数据,用户可以干其它事等待中断发生.
    BTFSC    PORTC,3        ;检测是否有应答.有应答继续.
    GOTO    NOACK        ;无应答转无应答处理程序.
    INCF    FSR        ;地址加1
    BCF    PIR1,SSPIF    ;清中断标志
    DECFSZ    COUNTI2C    ;计数器减1,
    GOTO    LOOPSEND    ;继续发送下一个字节
    BSF    STATUS,RP0
    BSF    SSPCON2,PEN    ;发送STOP条件.
    BCF    STATUS,RP0
TESTSTOP
    BTFSS    PIR1,SSPIF
    GOTO    TESTSTOP
    BCF    PIR1,SSPIF
    RETURN
NOACK                ;无应答处理子程序,这里略,一般是改变SSPADD里的值从新确定波特率
                ;或改变BUFADD里的值重新寻址
........
END



3楼: >>参与讨论
shaoguang
多谢楼上的朋友!
 
4楼: >>参与讨论
shaoguang
张工现在真的很忙了,希望他多来做做
 
5楼: >>参与讨论
xieyuanbin
一个礼拜能见到他2-3次已经不错了。
老是乱跑的。

6楼: >>参与讨论
wurg
乱跑
乱跑是为了找黄金.

参与讨论
昵称:
讨论内容:
 
 
相关帖子
RI-R6S-001A
picc探讨:圣经P405中清零问题!
请教版主,dsPIC和TMS320LF2407有的比吗?
16F84偶尔也复位
中断中写入buf[0]与buf[a]有什么不同
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号