IIC程序读问题

[复制链接]
2297|1
 楼主| cumtgirl 发表于 2008-3-15 11:30 | 显示全部楼层 |阅读模式
#include&nbsp;&quot;msp430x14x.h&quot;<br />#include&nbsp;&quot;define.h&quot;<br /><br />//使用方式:以涵数方式调用,使用时程序关闭总中断,使用完后打开总中断.<br />//占用资源为:使用两个IO口,本程序CPU主时钟MCLK=800K.<br />//SDA&nbsp;数据线定义<br />#define&nbsp;SDAOUT&nbsp;P1DIR&nbsp;|=&nbsp;BIT4<br />#define&nbsp;SDAIN&nbsp;&nbsp;P1DIR&nbsp;&=&nbsp;~BIT4<br />#define&nbsp;SDA1&nbsp;&nbsp;&nbsp;P1OUT&nbsp;|=&nbsp;BIT4<br />#define&nbsp;SDA0&nbsp;&nbsp;&nbsp;P1OUT&nbsp;&=&nbsp;~BIT4<br />//SCL&nbsp;时钟线定义<br />#define&nbsp;SCLOUT&nbsp;P6DIR&nbsp;|=&nbsp;BIT3<br />#define&nbsp;SCL1&nbsp;&nbsp;&nbsp;P6OUT&nbsp;|=&nbsp;BIT3<br />#define&nbsp;SCL0&nbsp;&nbsp;&nbsp;P6OUT&nbsp;&=&nbsp;~BIT3<br /><br />#define&nbsp;SDA_STATE&nbsp;P1IN&nbsp;&&nbsp;BIT4&nbsp;&nbsp;&nbsp;//读入SDA状态<br /><br />//从器件接收方的应答返回标志<br />#define&nbsp;OK&nbsp;0x01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//表示从器件有应答<br />#define&nbsp;NO&nbsp;0x00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//表示从器件无应答&nbsp;&nbsp;<br /><br />//IIC总线操作成失标志<br />#define&nbsp;error&nbsp;0x01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//错误<br />#define&nbsp;right&nbsp;0x00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//正确<br /><br />//IIC总线操作成失标志<br />&nbsp;#define&nbsp;error&nbsp;0x01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//错误<br />&nbsp;#define&nbsp;right&nbsp;0x00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//正确<br /><br />&nbsp;#define&nbsp;AT24_ADD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xA0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//24c02芯片地址&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;#define&nbsp;write&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//写<br />&nbsp;#define&nbsp;read&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读<br /><br />&nbsp;#define&nbsp;Quantity&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//操作数量<br />&nbsp;#define&nbsp;incept_add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x10&nbsp;&nbsp;&nbsp;//操作内部地址首址<br />&nbsp;<br />//写入AT24C02数据表<br />//&nbsp;&nbsp;unsigned&nbsp;char&nbsp;write_table[3]={'a','e','d'};<br />//读出AT24C02数据缓冲区<br />&nbsp;//unsigned&nbsp;char&nbsp;read_Buff[3]={'x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x','x'};&nbsp;<br />unsigned&nbsp;char&nbsp;read_Buff[3]={'x','x','x'};<br />//******************************************************<br />//MSP430F14初始化<br />void&nbsp;init&nbsp;(void)<br />{<br />&nbsp;&nbsp;&nbsp;<br />}<br />//******************************************************<br />//小延时<br />nop_()<br />{_NOP();_NOP();}<br /><br />SomeNOP()<br />&nbsp;{nop_();nop_();nop_();nop_();nop_();}<br />//******************************************************<br />//软延时<br />void&nbsp;delay(unsigned&nbsp;int&nbsp;n)<br />{unsigned&nbsp;int&nbsp;k;<br />&nbsp;for(k=0;k&ltn;k++);<br />}<br />//**************************************<br />void&nbsp;XCLR_LOW(void)<br />{<br />&nbsp;P1SEL&nbsp;&=&nbsp;~BIT6;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//P1.6普通IO<br />&nbsp;P1DIR&nbsp;|=&nbsp;&nbsp;BIT6;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//P1.6输出0<br />&nbsp;P1OUT&nbsp;&=&nbsp;~BIT6;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br />void&nbsp;XCLR_HIGH(void)<br />{<br />&nbsp;P1SEL&nbsp;&=&nbsp;~BIT6;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//P6.1普通IO<br />&nbsp;P1DIR&nbsp;|=&nbsp;&nbsp;BIT6;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//P6.1输出1<br />&nbsp;P1OUT&nbsp;|=&nbsp;&nbsp;BIT6;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br />//******************************************************<br />void&nbsp;main(void)<br />{<br />&nbsp;&nbsp;WDTCTL=WDTPW+WDTHOLD;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//停止WDT<br />&nbsp;&nbsp;&nbsp;//P6SEL&nbsp;&=&nbsp;~BIT3;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//P1.6普通IO<br />&nbsp;&nbsp;&nbsp;//P6DIR&nbsp;|=&nbsp;&nbsp;BIT3;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//P1.6输出0<br />&nbsp;&nbsp;&nbsp;//P6OUT&nbsp;|=&nbsp;&nbsp;BIT3;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;//P6OUT&nbsp;&=&nbsp;&nbsp;~BIT3;<br />&nbsp;&nbsp;&nbsp;//P6OUT&nbsp;|=&nbsp;&nbsp;BIT3;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;XCLR_LOW();<br />&nbsp;&nbsp;init();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//初始化<br />&nbsp;//&nbsp;IIC(write_table,Quantity,incept_add,(AT24_ADD|write));<br />&nbsp;delay(500);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//写入后,做一个适当的延时<br />&nbsp;IIC(read_Buff,Quantity,incept_add,(AT24_ADD|read));&nbsp;&nbsp;<br />&nbsp;LPM1;<br />}<br />//**************************************<br />//起始信号<br />void&nbsp;I2CStart(void)<br />&nbsp;{<br />&nbsp;_DINT();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//关总中断;<br />&nbsp;SCLOUT;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SCL口设为输出-------后加<br />&nbsp;SDAOUT;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SDA口设为输出&nbsp;<br />&nbsp;SDA1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;//SCLOUT;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SCL口设为输出&nbsp;<br />&nbsp;SCL1;<br />&nbsp;SomeNOP();&nbsp;SomeNOP();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//INI<br />&nbsp;SDA0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;SomeNOP();&nbsp;SomeNOP();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//START<br />&nbsp;SCL0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;}<br />//**************************************<br />//结束信号<br />void&nbsp;I2CStop(void)<br />&nbsp;{<br />&nbsp;&nbsp;SCL0;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;SDA0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;SomeNOP();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//INI<br />&nbsp;&nbsp;SCL1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;SomeNOP();&nbsp;<br />&nbsp;&nbsp;SDA1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//STOP<br />&nbsp;&nbsp;_EINT();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//EA=1;<br />&nbsp;}<br /><br />//**************************************<br />//等待从器件接收方的应答<br />unsigned&nbsp;char&nbsp;WaitAck(void)<br />&nbsp;{<br />&nbsp;unsigned&nbsp;char&nbsp;errtime=255;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//因故障接收方无ACK,超时值为255。<br />&nbsp;SDA1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;SomeNOP();<br />&nbsp;SCL1;<br />&nbsp;SomeNOP();<br />&nbsp;SDAIN;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SDA口设为输入<br />&nbsp;while(SDA_STATE)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SDA出现为0时,则为有应答<br />&nbsp;&nbsp;{&nbsp;errtime--;&nbsp;<br />&nbsp;&nbsp;&nbsp;if&nbsp;(!errtime)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//errtime是否为0<br />&nbsp;&nbsp;&nbsp;&nbsp;{I2CStop();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;NO;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//返回为0(失败)<br />&nbsp;&nbsp;}<br />&nbsp;SDAOUT;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SDA口设为输出&nbsp;<br />&nbsp;SCL0;&nbsp;<br />&nbsp;return&nbsp;OK;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//返回为1(成功)<br />&nbsp;}<br />//**************************************<br />//主器件为接收方,从器件为发送方时,单片机发出应答信号<br />//MCU&nbsp;Send&nbsp;to&nbsp;IC<br />void&nbsp;SendAck(void)<br />&nbsp;{<br />&nbsp;SDA0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;SomeNOP();<br />&nbsp;SCL1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;SomeNOP();<br />&nbsp;SCL0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;}<br />//**************************************<br />//主器件为接收方,从器件为发送方时,非应答信号<br />void&nbsp;SendNotAck(void)<br />&nbsp;{<br />&nbsp;SDA1;&nbsp;&nbsp;<br />&nbsp;SomeNOP();<br />&nbsp;SCL1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;SomeNOP();<br />&nbsp;SCL0;&nbsp;<br />&nbsp;}<br />//**************************************<br />//发送字节<br />&nbsp;void&nbsp;I2CSendByte(unsigned&nbsp;char&nbsp;ch)<br />&nbsp;{<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i=8;<br />&nbsp;&nbsp;while&nbsp;(i--)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;SCL0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SCL=0;<br />&nbsp;&nbsp;&nbsp;nop_();<br />&nbsp;&nbsp;&nbsp;if(ch&0x80)<br />&nbsp;&nbsp;&nbsp;&nbsp;SDA1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使SDA为1位<br />&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;SDA0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使SDA为0位<br />&nbsp;&nbsp;&nbsp;&nbsp;ch&lt&lt=1;&nbsp;<br />&nbsp;&nbsp;&nbsp;SomeNOP();<br />&nbsp;&nbsp;&nbsp;SCL1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;SomeNOP();<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;SCL0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;}<br />//**************************************<br />//接收字节<br />unsigned&nbsp;char&nbsp;I2CReceiveByte(void)<br />&nbsp;{<br />&nbsp;unsigned&nbsp;char&nbsp;i=8;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//接收8位<br />&nbsp;unsigned&nbsp;char&nbsp;ddata;<br />&nbsp;SDA1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;SDAIN;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SDA口设为输入<br />&nbsp;while&nbsp;(i--)<br />&nbsp;{<br />&nbsp;&nbsp;ddata&lt&lt=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//将ddata位向高位移,让位0<br />&nbsp;&nbsp;SCL0;<br />&nbsp;&nbsp;SomeNOP();<br />&nbsp;&nbsp;SCL1;<br />&nbsp;&nbsp;SomeNOP();<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;if(SDA_STATE)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读入SDA,后加<br />&nbsp;&nbsp;ddata|=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;}<br />&nbsp;SCL0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SCL=0;<br />&nbsp;SDAOUT;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//(附加)SDA口设回为输出<br />&nbsp;return&nbsp;&nbsp;ddata;<br />&nbsp;}<br />//**********************************************************************<br />//正常操作时返回位值为0,有故障时返回位值为1.<br />//unsigned&nbsp;char&nbsp;*DataBuff数据缓冲区指针,char&nbsp;ByteQuantity字节数量,<br />//unsigned&nbsp;int&nbsp;Address&nbsp;IC片内地址,<br />//unsigned&nbsp;char&nbsp;ControlByte芯片控制字节-IC地址/读写位,<br />unsigned&nbsp;char&nbsp;IIC(unsigned&nbsp;char&nbsp;*DataBuff,char&nbsp;ByteQuantity,unsigned&nbsp;int&nbsp;Address,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;ControlByte)<br />{<br />&nbsp;unsigned&nbsp;char&nbsp;errorflag=error;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//错误标志位,1为错误,0为正确<br />&nbsp;unsigned&nbsp;char&nbsp;i;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//i为允许本次操作的最大次数<br />&nbsp;&nbsp;i=1;<br />&nbsp;SCLOUT;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//时钟口长设为输出<br />&nbsp;while(i--)<br />&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;I2CStart();<br />&nbsp;&nbsp;&nbsp;I2CSendByte(ControlByte&0xfe);//指定芯片,此次必定为写<br />&nbsp;&nbsp;&nbsp;if(!WaitAck())&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//涵数返回一个1为成功<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//结束写操作,并i-1后,再来一次<br />&nbsp;&nbsp;&nbsp;I2CSendByte((unsigned&nbsp;char)Address);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送片内地址<br />&nbsp;&nbsp;&nbsp;if(!WaitAck())&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//数返回一个1为成功&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//结束写操作,并i-1后,再来一次&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;//------------------------------已经选定好IC<br />&nbsp;&nbsp;&nbsp;if(!(ControlByte&0x01))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//本次操作是读还是写<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//写操作<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errorflag=right;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//清错误标志位为0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(ByteQuantity--)&nbsp;&nbsp;&nbsp;//操作j个数字节<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CSendByte(*DataBuff++);//发送&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(WaitAck())&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//涵数返回一个1为成功,涵数返回一个0为失败<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//成功,下一个数据循环(跳while)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errorflag=error;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//不应答,失败了.&nbsp;errorflag=1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//退出写操作<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(errorflag==error)&nbsp;//经过写完后,如果最后errorflag标志为1,则表示有错误<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//结束写操作,并i-1后,再来一次<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//写操作完成<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//则为读操作<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;I2CStart();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CSendByte(ControlByte);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!WaitAck())&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//涵数返回一个1为成功<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{continue;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//结束此操作,并i-1后,再来一次<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(--ByteQuantity)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读入ByteQuantity个数字节<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{*DataBuff++=I2CReceiveByte();//连续读入ByteQuantity个数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendAck();}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//主机向从机发出应答,表示主机已接收&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*DataBuff=I2CReceiveByte();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读入最后个数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendNotAck();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//最后发出不应答信号(位),表示主机不再读了.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errorflag=right;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//向错误标志位写0(right),表示读数据正确.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读操作完成*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;I2CStop();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//停止,结束IIC总线<br />&nbsp;return(errorflag);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//返回操作成败标志<br />}
 楼主| cumtgirl 发表于 2008-3-15 11:38 | 显示全部楼层

re

在430F149的微控开发板上运行好好的,可以读出,也可以写入数据。为什么换到我的Msp430F133的板上运行,就读不出数据呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

140

主题

293

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部