共2条
1/1 1 跳转至页
msp430,I2C 哪位可以给我发个msp430与I2C接口芯片的C语言例程,谢谢!
问
哪位可以给我发个MSP430与I2C接口芯片的C语言例程,谢谢!
答 1:
//--------------------------------------------------------------
//启动总线函数:启动I2C总线,即发送I2C起始条件
//--------------------------------------------------------------
void Start_I2c(void)
{
SDA1;_NOP();SCL1;SomeNOP(); SDA0;SomeNOP(); SCL0;
}
//---------------------------------------------------------------
//结束I2C总线,发送结束条件
//---------------------------------------------------------------
void Stop_I2c(void)
{
SCL0;_NOP(); SDA0;_NOP(); SCL1;SomeNOP(); SDA1;SomeNOP();
}
//----------------------------------------------------------------
//字节数据传送函数
//将数据C发送出去,可以时地址,也可以是数据,发完后等待应答,并对此状态位
//进行操作(不应答或非应答都使ack=0假)。发送数据正常,ack=1;ack=0 表
//示被控器无应答或损坏。
//----------------------------------------------------------------
uchar SendByte(uchar c)
{
uchar BitCnt,ack;
for(BitCnt=0;BitCnt<8;BitCnt++)
{
if((c<<BitCnt)&0x80)
{
SDA1;_NOP();
}
else
{
SDA0;_NOP();
}
SCL1;SomeNOP(); /*置数据线为高,通知被控器开始接收数据位*/
SCL0;SomeNOP();
}
SDA1;SomeNOP(); /*8位发送完后释放数据线,准备接收应答位*/
SCL1;SomeNOP();
I2CIn;
if (P3IN&0x02) ack=0;
else ack=1;
_NOP();SCL0;
I2COut; //direction=output
return(ack);
}
//----------------------------------------------------------------
//字节数据接收函数
//用来接收从器件传来的数据,并判断总线错误(不发应答信号),
//发完后请用应答函数
//----------------------------------------------------------------
uchar RcvByte(void)
{
uchar retc;
uchar BitCnt;
retc=0;
I2COut; //direction=output
SDA1;_NOP(); //置数据线为输入方式*/
for(BitCnt=0;BitCnt<8;BitCnt++)
{
SCL0;SomeNOP(); /*置时钟线为低,准备接收数据位*/
SCL1;SomeNOP(); /*置时钟线上为高使数据线上数据有效*/
retc=retc<<1;
I2CIn; //direction=input
SomeNOP();
if (P3IN&0x02) retc=retc+1; //*读数据位,接收的数据位放入retc中*/
}
SCL0;SomeNOP();
return(retc);
}
//----------------------------------------------------------------
//应答函数:主控器进行应答信号,(可以是应答或非应答信号)
//----------------------------------------------------------------
void Ack_I2c(uchar a)
{
I2COut;SomeNOP(); //SDA OUTPUT
if(a==0) /*在此发出应答或非应答信号*/
{
SDA0;
}
else
{
SDA1;
}
SomeNOP();SCL1;SomeNOP(); /*时钟低电平周期大于4us*/
SCL0;; /*清时钟线,钳住I2C总线以便继续接收*/
}
//---------------------------------------------------------------
//向有子地址器件发送多字节数据函数
//从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件地址sla,
//子地址suba,发送内容是s指向的内容,发送no个字节。如果返回1表示操作
//成功,否则操作有误。
//---------------------------------------------------------------
uchar ISendStr(uchar sla,uchar suba, uchar *s,uchar no)
{
uchar i,ack;
Start_I2c(); //启动总线
ack=SendByte(sla); //发送器件地址
if (ack==0) return(0);
ack=SendByte(suba); //发送器件子地址
if (ack==0) return(0);
for(i=0;i<no;i++)
{
ack=SendByte(*s); //发送数据
if (ack==0) return(0);
s++;
}
Stop_I2c(); //结束总线
return(1);
}
//--------------------------------------------------------------
//向有子地址器件读取多字节数据函数
//从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件地址sla,
//子地址suba,读出的内容放入s指向的存储区,读no个字节。如果返回1 表示操作
//成功,否则操作有误。
//---------------------------------------------------------------
uchar IRcvStr(uchar sla,uchar suba, uchar *s,uchar no)
{
uchar i,ack;
Start_I2c(); //启动总线
ack=SendByte(sla); //发送器件地址
if (ack==0) return(0);
ack=SendByte(suba); //发送器件子地址
if (ack==0) return(0);
Start_I2c();
ack=SendByte(sla+1);
if (ack==0) return(0);
for(i=0;i<no-1;i++)
{
*s=RcvByte(); //接收数据
Ack_I2c(0); //发送就答位
s++;
}
*s=RcvByte();
Ack_I2c(1); //发送非应位
Stop_I2c(); //结束总线
return(1);
}
对了我系统的主频是2M的! 答 2: 我现用F169做一个小系统,不过对I2C的设定有些不太明白,我理解如果和一个带I2C总线的传感器相连,设成 Master mode是否可行(如TI的TMP100)。 答 3: 多谢多谢!! 答 4: 根据下面的语句
if (P3IN&0x02) ack=0;
管脚P3.1应与I2c器件的哪个脚相连?谢谢!! 答 5: :) I2C 总线就2根线阿!当然是SDA线了!这时是输入信号! 答 6: 引用: 答 7: 我用的是MSP430f413,你的SomeNop()函数没有提供啊,
还有梁工用的是2M的系统,我的好像是4M的,延时是否需
要加长? 答 8: 自己试着改动一下吧!还有电路可能不同,可能还要相应修改一些管脚定义。
SomeNOP()你用10个_NOP();试试。
//启动总线函数:启动I2C总线,即发送I2C起始条件
//--------------------------------------------------------------
void Start_I2c(void)
{
SDA1;_NOP();SCL1;SomeNOP(); SDA0;SomeNOP(); SCL0;
}
//---------------------------------------------------------------
//结束I2C总线,发送结束条件
//---------------------------------------------------------------
void Stop_I2c(void)
{
SCL0;_NOP(); SDA0;_NOP(); SCL1;SomeNOP(); SDA1;SomeNOP();
}
//----------------------------------------------------------------
//字节数据传送函数
//将数据C发送出去,可以时地址,也可以是数据,发完后等待应答,并对此状态位
//进行操作(不应答或非应答都使ack=0假)。发送数据正常,ack=1;ack=0 表
//示被控器无应答或损坏。
//----------------------------------------------------------------
uchar SendByte(uchar c)
{
uchar BitCnt,ack;
for(BitCnt=0;BitCnt<8;BitCnt++)
{
if((c<<BitCnt)&0x80)
{
SDA1;_NOP();
}
else
{
SDA0;_NOP();
}
SCL1;SomeNOP(); /*置数据线为高,通知被控器开始接收数据位*/
SCL0;SomeNOP();
}
SDA1;SomeNOP(); /*8位发送完后释放数据线,准备接收应答位*/
SCL1;SomeNOP();
I2CIn;
if (P3IN&0x02) ack=0;
else ack=1;
_NOP();SCL0;
I2COut; //direction=output
return(ack);
}
//----------------------------------------------------------------
//字节数据接收函数
//用来接收从器件传来的数据,并判断总线错误(不发应答信号),
//发完后请用应答函数
//----------------------------------------------------------------
uchar RcvByte(void)
{
uchar retc;
uchar BitCnt;
retc=0;
I2COut; //direction=output
SDA1;_NOP(); //置数据线为输入方式*/
for(BitCnt=0;BitCnt<8;BitCnt++)
{
SCL0;SomeNOP(); /*置时钟线为低,准备接收数据位*/
SCL1;SomeNOP(); /*置时钟线上为高使数据线上数据有效*/
retc=retc<<1;
I2CIn; //direction=input
SomeNOP();
if (P3IN&0x02) retc=retc+1; //*读数据位,接收的数据位放入retc中*/
}
SCL0;SomeNOP();
return(retc);
}
//----------------------------------------------------------------
//应答函数:主控器进行应答信号,(可以是应答或非应答信号)
//----------------------------------------------------------------
void Ack_I2c(uchar a)
{
I2COut;SomeNOP(); //SDA OUTPUT
if(a==0) /*在此发出应答或非应答信号*/
{
SDA0;
}
else
{
SDA1;
}
SomeNOP();SCL1;SomeNOP(); /*时钟低电平周期大于4us*/
SCL0;; /*清时钟线,钳住I2C总线以便继续接收*/
}
//---------------------------------------------------------------
//向有子地址器件发送多字节数据函数
//从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件地址sla,
//子地址suba,发送内容是s指向的内容,发送no个字节。如果返回1表示操作
//成功,否则操作有误。
//---------------------------------------------------------------
uchar ISendStr(uchar sla,uchar suba, uchar *s,uchar no)
{
uchar i,ack;
Start_I2c(); //启动总线
ack=SendByte(sla); //发送器件地址
if (ack==0) return(0);
ack=SendByte(suba); //发送器件子地址
if (ack==0) return(0);
for(i=0;i<no;i++)
{
ack=SendByte(*s); //发送数据
if (ack==0) return(0);
s++;
}
Stop_I2c(); //结束总线
return(1);
}
//--------------------------------------------------------------
//向有子地址器件读取多字节数据函数
//从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件地址sla,
//子地址suba,读出的内容放入s指向的存储区,读no个字节。如果返回1 表示操作
//成功,否则操作有误。
//---------------------------------------------------------------
uchar IRcvStr(uchar sla,uchar suba, uchar *s,uchar no)
{
uchar i,ack;
Start_I2c(); //启动总线
ack=SendByte(sla); //发送器件地址
if (ack==0) return(0);
ack=SendByte(suba); //发送器件子地址
if (ack==0) return(0);
Start_I2c();
ack=SendByte(sla+1);
if (ack==0) return(0);
for(i=0;i<no-1;i++)
{
*s=RcvByte(); //接收数据
Ack_I2c(0); //发送就答位
s++;
}
*s=RcvByte();
Ack_I2c(1); //发送非应位
Stop_I2c(); //结束总线
return(1);
}
对了我系统的主频是2M的! 答 2: 我现用F169做一个小系统,不过对I2C的设定有些不太明白,我理解如果和一个带I2C总线的传感器相连,设成 Master mode是否可行(如TI的TMP100)。 答 3: 多谢多谢!! 答 4: 根据下面的语句
if (P3IN&0x02) ack=0;
管脚P3.1应与I2c器件的哪个脚相连?谢谢!! 答 5: :) I2C 总线就2根线阿!当然是SDA线了!这时是输入信号! 答 6: 引用: 答 7: 我用的是MSP430f413,你的SomeNop()函数没有提供啊,
还有梁工用的是2M的系统,我的好像是4M的,延时是否需
要加长? 答 8: 自己试着改动一下吧!还有电路可能不同,可能还要相应修改一些管脚定义。
SomeNOP()你用10个_NOP();试试。
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |