|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
请问张工 |
作者:shaoguang 栏目:单片机 |
张工你好:你书上的关于I2C通讯程序范例,都是通过验证的吗?特别是PIC单片机通过I2C通讯,的硬件主模式程序, 我调试没通过呀!! 我想请教一下用I2C时是采用硬件方式好调试那,还是用软件模拟I2C方式好那? 我在一个板子里用两片PIC16F877A采用I2C方式通讯,一个采用主模式,另一个采用中断从模式. 请张工给个调试过的例子,多谢!!! |
2楼: | >>参与讨论 |
作者: xieyuanbin 于 2004/10/22 6:59:00 发布:
这是我两年前的发送例程,调试通过。 ;这是一个由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 于 2004/10/22 10:13:00 发布:
多谢楼上的朋友! |
4楼: | >>参与讨论 |
作者: shaoguang 于 2004/10/22 10:26:00 发布:
张工现在真的很忙了,希望他多来做做 |
5楼: | >>参与讨论 |
作者: xieyuanbin 于 2004/10/22 10:41:00 发布:
一个礼拜能见到他2-3次已经不错了。 老是乱跑的。 |
6楼: | >>参与讨论 |
作者: wurg 于 2004/10/22 16:14:00 发布:
乱跑 乱跑是为了找黄金. |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |