3455|1

43

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

MSP430上MMA7455关于IIC的问题 [复制链接]

本帖最后由 paulhyde 于 2014-9-15 04:22 编辑

MSP430,写了一个EEPROM的程序,IIC 通过.~在用同样的IIC,做 MMA7455,为什么 ACK或者CHECK,或者叫respons怎么没应答(用一个IF()就可以知道有没有应答了)......今天搞了半天.... 就是不行...求指教啊..结果是 X1=0,Y1=255,


//这是 IIC.C
#include

#define SCL_H P1OUT |= BIT2
#define SCL_L P1OUT &= ~BIT2
#define SDA_H P1OUT |= BIT3
#define SDA_L P1OUT &= ~BIT3

#define SDA_in P1DIR &= ~BIT3 //SDA改成输入模式
#define SDA_out P1DIR |= BIT3 //SDA变回输出模式
#define SDA_val P1IN&BIT3 //SDA的位值

#define TRUE 1
#define FALSE 0

/*******************************************
函数名称:delay
功 能:延时约15us的时间
参 数:无
返回值 :无
********************************************/
void delay(void)
{
uchar i;

for(i = 0;i < 15;i++)
_NOP();
}
/*******************************************
函数名称:start
功 能:完成IIC的起始条件操作
参 数:无
返回值 :无
********************************************/
void start(void)
{
SCL_H;
SDA_H;
delay();
SDA_L;
delay();
SCL_L;
delay();
}
/*******************************************
函数名称:stop
功 能:完成IIC的终止条件操作
参 数:无
返回值 :无
********************************************/
void stop(void)
{
SDA_L;
delay();
SCL_H;
delay();
SDA_H;
delay();
}
/*******************************************
函数名称:mack
功 能:完成IIC的主机应答操作
参 数:无
返回值 :无
********************************************/
void mack(void)
{
SDA_L;
_NOP(); _NOP();
SCL_H;
delay();
SCL_L;
_NOP();_NOP();
SDA_H;
delay();
}
/*******************************************
函数名称:mnack
功 能:完成IIC的主机无应答操作
参 数:无
返回值 :无
********************************************/
void mnack(void)
{
SDA_H;
_NOP(); _NOP();
SCL_H;
delay();
SCL_L;
_NOP(); _NOP();
SDA_L;
delay();
}

/**********检查应答信号函数******************/
/*如果返回值为1则证明有应答信号,反之没有*/
/*******************************************
函数名称:check
功 能:检查从机的应答操作
参 数:无
返回值 :从机是否有应答:1--有,0--无
********************************************/
uchar check(void)
{
uchar slaveack;

SDA_H;
_NOP(); _NOP();
SCL_H;
_NOP(); _NOP();
SDA_in;
_NOP(); _NOP();
slaveack = SDA_val; //读入SDA数值
SCL_L;
delay();
SDA_out;
if(slaveack) return FALSE;
else return TRUE;
}
/*******************************************
函数名称:write1
功 能:向IIC总线发送一个1
参 数:无
返回值 :无
********************************************/
void write1(void)
{
SDA_H;
delay();
SCL_H;
delay();
SCL_L;
delay();
}
/*******************************************
函数名称:write0
功 能:向IIC总线发送一个0
参 数:无
返回值 :无
********************************************/
void write0(void)
{
SDA_L;
delay();
SCL_H;
delay();
SCL_L;
delay();
}
/*******************************************
函数名称:write1byte
功 能:向IIC总线发送一个字节的数据
参 数:wdata--发送的数据
返回值 :无
********************************************/
void write1byte(uchar wdata)
{
uchar i;

for(i = 8;i > 0;i--)
{
if(wdata & 0x80) write1();
else write0();
wdata <<= 1;
}

SDA_H;
_NOP();
}
/*******************************************
函数名称:writeNbyte
功 能:向IIC总线发送N个字节的数据
参 数:outbuffer--指向发送数据存放首地址
的指针
n--数据的个数
返回值 :发送是否成功的标志:1--成功,0--失败
********************************************/
uchar writeNbyte(uchar * outbuffer,uchar n)
{
uchar i;

for(i = 0;i < n;i++)
{
write1byte(* outbuffer);
if(check())
{
outbuffer++;
}
else
{
stop();
return FALSE;
}
}

stop();
return TRUE;
}
/*******************************************
函数名称:read1byte
功 能:从IIC总线读取一个字节
参 数:无
返回值 :读取的数据
********************************************/
uchar read1byte(void)
{
uchar rdata = 0x00,i;
uchar flag;

for(i = 0;i < 8;i++)
{
SDA_H;
delay();
SCL_H;
SDA_in;
delay();
flag = SDA_val;
rdata <<= 1;
if(flag) rdata |= 0x01;
SDA_out;
SCL_L;
delay();
}

return rdata;
}
/*******************************************
函数名称:readNbyte
功 能:从IIC总线读取N个字节的数据
参 数:inbuffer--读取后数据存放的首地址
n--数据的个数
返回值 :无
********************************************/
void readNbyte(uchar * inbuffer,uchar n)
{
uchar i;

for(i = 0;i < n;i++)
{
inbuffer = read1byte();
if(i < (n-1)) mack();
else mnack();
}

stop();
}


//这是 MMA7455.C

#include
#include "IIC.H"
#include "MMA7455.h"

extern unsigned char X1,Y1,Z1;

void delay_10ms(void)
{
int i = 1000;
while(i--);
}
void mma7455()
{
start();
write1byte(MMA7455_ADDER_WRITE); //1. IIC地址寻址
if(check())
X1=1; //这里 想看看有没有应答 改变X1的值!!! 结果是 X1=0,Y1=255,
write1byte(MMA7455_READ_X); //2. X轴数据寄存器寻址
start(); //3.
write1byte(MMA7455_ADDER_READ); //改变读写方向
if(check())
X1=read1byte(); //4.读数据
stop();
delay_10ms();

start();
write1byte(MMA7455_ADDER_WRITE); //1. IIC地址寻址
check();
write1byte(MMA7455_READ_Y); //2. X轴数据寄存器寻址
start(); //3.
write1byte(MMA7455_ADDER_READ); //改变读写方向
check();
Y1=read1byte(); //4.读数据
stop();
delay_10ms();
}

void INIT_MMA7455()
{

//写数据
start();
write1byte(MMA7455_ADDER_WRITE); //1. 在IIC总线上寻址MMA7455
check();
write1byte(MMA7455_Mode_Control_Register); //2. 模式设置寄存器寻址

check();
write1byte(0x05); //3. 模式寄存器数据写入

check();
stop();
delay_10ms();
//写数据
start();
write1byte(MMA7455_ADDER_WRITE); //1. 在IIC总线上寻址MMA7455
check();
write1byte(MMA7455_Mode_Control_Register); //2. 量程检测设置寄存器寻址

check();
write1byte(MMA7455_2G_Measurement_Mode); //3. 设置量程为2G,检测模式。量程检测设置寄存器配置数据写入


check();

stop();
delay_10ms();
}

结果是 X1=0,Y1=255,

 

 

此帖出自电子竞赛论坛

最新回复

本帖最后由 paulhyde 于 2014-9-15 04:22 编辑 您好请教下 您的模块式如何和单片机连接的    详情 回复 发表于 2013-6-12 12:12
点赞 关注
 
 

回复
举报

5

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
本帖最后由 paulhyde 于 2014-9-15 04:22 编辑

您好请教下 您的模块式如何和单片机连接的

 

此帖出自电子竞赛论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表