4000|8

68

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

430高手可否帮我看一下这个程序哪里错了 [复制链接]

想利用430—2274的I2C来读一个芯片的数据,不知道为什么老是读出全是0xFF。

#include "msp430x22x4.h"
# define uchar unsigned char
# define uint unsigned int



#define SDA_IN P3DIR &=~BIT1 // P3.1 IN
#define SDA_OUT P3DIR |=BIT1 // P3.1 OUT
#define SDA_LOW P3OUT &=~BIT1 // sda=0
#define SDA_HIGH P3OUT |=BIT1 // sda=1
#define SCL_IN P3DIR &=~BIT2 // P3.2 IN
#define SCL_OUT P3DIR |=BIT2 // P3.2 OUT
#define SCL_LOW P3OUT &=~BIT2
#define SCL_HIGH P3OUT |=BIT2

uchar Temp[8]={0,1,2,3,4,5,6,7};

void mDelay(uint t) //延时子程序
{ int i;
for(;t>0;t--)
{ for(i=0;i<124;i++)
{;}
}
}
void delay (unsigned int TT)
{
for (;TT!=0;TT--);
}




void IIC_START (void) //I2C_START
{ SDA_OUT;
SDA_HIGH;
SCL_HIGH;
delay (50);
SDA_LOW;
delay (50);
SCL_LOW;
delay (50);
}

void IIC_STOP (void) //I2C_STOP
{ SDA_OUT;
SDA_LOW;
delay (50);
SCL_HIGH;
delay (50);
SDA_HIGH;
delay (50);
SCL_LOW;
}

void IIC_ACK (void) //IIC_ACK
{ SDA_OUT;
SDA_LOW;
delay (50);
SCL_HIGH;
delay (50);
SCL_LOW;
delay (50);
SDA_HIGH;
}
void IIC_TX_DATA (unsigned char DATA)
{unsigned char Rn=8,RR=0x80;
SDA_OUT;
delay (50);
for (;Rn!=0;Rn--)
{
if ((DATA&RR)!=0)
SDA_HIGH;
else
SDA_LOW;
delay (50);
SCL_HIGH;
delay (50);
SCL_LOW;
delay (50);
RR>>=1;
}
SDA_HIGH; // ACK
delay (50);
SCL_HIGH;
delay (50);
SCL_LOW;
delay (50);
}
unsigned char IIC_RX_DATA (void)
{
unsigned int Rn=8,DATA=0,RR=0x80;
SDA_IN; // 端口为输入
delay (50);
for (;Rn!=0;Rn--)
{
SCL_HIGH;
delay (50);

if ((P3IN&BIT2)!=0)
DATA|=RR;
else
DATA&=~RR;
RR>>=1;
SCL_LOW;
delay (50);
}

return DATA;
}



void IIC_Ena××e(void)
{

//*****************开始启动并唤醒 MEMS********
IIC_START();
mDelay(75);
IIC_TX_DATA(0x20); //写入[0010xxx0] 写操作
IIC_TX_DATA(0x00);//写入地址[00000000]
IIC_TX_DATA(0x00);//写入CALL UP命令 [xxxxxxx0]
IIC_STOP();
//**********************************************
}



void main (void)
{



WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer

DCOCTL = 0X73;
BCSCTL1= 0X87; // 设置时钟频率4.00MHz



// SimpliciTI will change port pin settings as well
P3DIR = 0x06;//SDA,SCL
P3OUT |=0X06;
P3SEL |=0x06; //3.1和3.2引脚当做外围功能, Assign I2C pins to USCI_B0
UCB0CTL0 = UCMST + UCMODE_0 + UCSYNC; // I2C Master, synchronous mode
UCB0CTL1 = UCSSEL_0; //// Use SMCLK
UCB0BR0 = 12; // fSCL = SMCLK/12 = ~100kHz
UCB0BR1 = 0;
UCB0I2CSA = 0x00; // Set sl××e address
IE2 |= UCB0RXIE; // Ena××e RX interrupt
TACTL = TASSEL_2 + MC_2; // SMCLK, contmode
SDA_HIGH;
SCL_HIGH;
IIC_Ena××e();


//可以直接 读的地址先指名 开始地址
IIC_START();
mDelay(75);
IIC_TX_DATA(0x20); //写入[0010xxx0] 写操作
delay(50);
IIC_TX_DATA(0x00); //现在是从[00000000]开始的
delay(50);
IIC_TX_DATA(0x00); //call up
IIC_STOP();
mDelay(75); //等待75MS
//***************开始读取MEMS信息
IIC_START();
IIC_TX_DATA(0x21); //写入[0010xxx1] 读操作命令
delay(50);
IIC_TX_DATA(0x00);
delay(50);
IIC_TX_DATA(0x02);
delay(50);


//*****************************************
mDelay(250);
while(1)
{
uint i =0;
for(i=0;i<8;i++)
{

Temp[i] = IIC_RX_DATA();
IIC_ACK();
delay(50);
}
}

}

最新回复

我也刚做完IIC还好成功了,是向eeprom中读写数据折腾了我一周。具体步骤就按照msp430的pdf文件就好,另外在传输数据时加些延时。我就是因为少了个延时在读数据时老是把地址也写进rom中,我在写数据结束后加些延时就解决问题了  详情 回复 发表于 2009-7-26 15:23
 
点赞 关注

回复
举报

82

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你到底是模拟的 还是硬件的?
子函数貌似模拟的 主函数里又有硬件i2c模块的配置程序 咋搞的?
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
要读的芯片是美芯公司的MXC6202xG/H/M/N
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
请高手帮我指出哪里错了,我想用的是模拟的
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

5
 
送你一个模拟的i2c主机程序
代码:
#include <msp430x44x.h>

#define   SET_SCL     D4DIR &= ~BIT6
#define   SET_SDA     D4DIR &= ~BIT7
#define   CLR_SCL     P4DIR |=  BIT6
#define   CLR_SDA     P4DIR |=  BIT7

unsigned char ACK_flag;

//*******************************************
void init_I2C(void)
{
  P4OUT = 0;
  P4DIR = 0;     //全部为输入状态,即位高电平
}

//*******************************************
void START(void)//SCL为高的时候,SDA一个下降沿
{
SET_SDA;
SET_SCL;
Delay(5);
CLR_SDA;
Delay(5);
CLR_SCL;
}

//********************************************
void STOP(void)//SCL为高的时候,SDA一个上升沿
{
CLR_SCL;
CLR_SDA;
SET_SCL;
Delay(5);
SET_SDA;
Delay(5);
CLR_SCL;
}

/*************************************************
  函数(模块)名称:
  功能:	应答信号
  输入参数: 无     	          		
  输出参数: 无  	
  函数返回值说明:无 		
  使用的资源:   		
  它说明: 从机发ACK告诉主机一个字节的读/写操作完成
*************************************************/
void ACK(void)//SCL为高的时候,SDA为低
{
CLR_SDA;
SET_SCL;
Delay(5);
CLR_SCL;
Delay(5);
SET_SDA;
}

/*************************************************
  函数(模块)名称:
  功能:	非应答信号
  输入参数: 无     	          		
  输出参数: 无  	
  函数返回值说明:无 		
  使用的资源:   		
  它说明: 主机发NO_ACK告诉从机读操作完成
*************************************************/
void NO_ACK(void)//SCL为高的时候,SDA也为高
{
SET_SDA;
SET_SCL;
Delay(5);
CLR_SCL;
Delay(5);
CLR_SDA;
}
/*************************************************
  函数(模块)名称:
  功能:	等待应答信号
  输入参数: 无     	          		
  输出参数: 无  	
  函数返回值说明:无 		
  使用的资源:   		
  它说明: 从机有应答则ACK_flag=0,否则为1	
*************************************************/
void Wait_ACK(void)//主机释放总线,等待回应信号
{
SET_SDA;
SET_SCL;
ACK_flag=0;
Delay(5);   
if(P4IN & BIT7)
{
  ACK_flag=1;  //无回应信号,ACK_flag=1
}
Delay(5);
CLR_SCL;
}

/*************************************************
  函数(模块)名称:
  功能:	完成一个字节的写操作
  输入参数: 要写的数据       	          		
  输出参数: 无  	
  函数返回值说明: 		
  使用的资源    		
  它说明: 	
*************************************************/

void Write8bit(unsigned char date)
{
char bits=8;
while(bits-- != 0)
  {
  
  if(date & 0x80)
     SET_SDA;
  else
     CLR_SDA;

  SET_SCL;
  Delay(10);
  date <<= 1;
  CLR_SCL;

  }
}
/*************************************************
  函数(模块)名称:
  功能:	完成一个字节的读操作
  输入参数: 无        	          		
  输出参数: 所读数据   	
  函数返回值说明: 		
  使用的资源    		
  其它说明: 	
*************************************************/
unsigned char Read8bit(void)
{
 char bits=8;
unsigned char temp=0;
while(bits-- != 0)
  {
  SET_SDA;
  SET_SCL;              //接收方,在SCL为高的时候读SDA
  
  temp<<=1;
  Delay(5);
  if(P4IN & BIT7)        
  temp=temp|0x01;
  Delay(5);
  CLR_SCL;              
  }
return(temp);
}

/*************************************************
  函数(模块)名称:
  功能:	完成24LC01的字节写
  输入参数: 被写数据地址,数据写入地址,写数据的字节数        	          		
  输出参数: 0或者1    	
  函数返回值说明: 页写成功返回0,否则返回1 		
  使用的资源    		
  其它说明: 	
*************************************************/
unsigned char ByteWrite24LC01(unsigned char *p_date,unsigned char adr,
                         unsigned char nbyte)
{

while(nbyte-- != 0)
 {
  START();
  Write8bit(W_DEVICE_ADR);   //发送设备地址
  Wait_ACK();
  if( ACK_flag==1 )         //无应答(写一个字节要等待从设备返回一个应答)
  return 1;
  
  Write8bit(adr);            //24LC01中被写的首地址
  Wait_ACK();
   if( ACK_flag==1 )         //无应答(写一个字节要等待从设备返回一个应答)
  return 1;
  
  Write8bit(*p_date);        //发送数据
  Wait_ACK();
  if( ACK_flag==1 )         //无应答(写一个字节要等待从设备返回一个应答)
  return 1;
  
  p_date++;
  adr++;
  STOP();
  }
   return 0;
}
/*************************************************
  函数(模块)名称:
  功能:	完成24LC01的页写
  输入参数: 被写数据地址,数据写入地址,写数据的字节数        	          		
  输出参数: 0或者1    	
  函数返回值说明: 页写成功返回0,否则返回1 		
  使用的资源    		
  其它说明:一页是8个字节,页写时注意页地址,否则出错	
*************************************************/
unsigned char PageWrite24LC01(unsigned char *p_date,unsigned char adr,
                         unsigned char nbyte)
{
  unsigned int x,y;
  unsigned char z;
  START();
  x=8-adr%8;
  y=adr+x;
  z=nbyte-x;
  
  Write8bit(W_DEVICE_ADR);   //发送设备地址
  Wait_ACK();
  if( ACK_flag==1 )         //无应答(写一个字节要等待从设备返回一个应答)
  return 1;
  
  Write8bit(adr);            //24LC01中被写的首地址
  Wait_ACK();
   if( ACK_flag==1 )         //无应答(写一个字节要等待从设备返回一个应答)
  return 1;
  
  while(x-- != 0)
  {
  Write8bit(*p_date);        //发送数据
  Wait_ACK();
  if( ACK_flag==1 )         //无应答(写一个字节要等待从设备返回一个应答)
  return 1;
  p_date++;
  }
  STOP();
  Delay5Ms_OPEN();
  LPM3;
 
  START();
  Write8bit(W_DEVICE_ADR);   //发送设备地址
   Wait_ACK();
  if( ACK_flag==1 )         //无应答(写一个字节要等待从设备返回一个应答)
  return 1;
 
  Write8bit(y);            //24LC01中被写的首地址
  Wait_ACK();
  if( ACK_flag==1 )         //无应答(写一个字节要等待从设备返回一个应答)
  return 1;
  
  while(z-- != 0)
  {
  Write8bit(*p_date);        //发送数据
  Wait_ACK();
  if( ACK_flag==1 )         //无应答(写一个字节要等待从设备返回一个应答)
  return 1;
  p_date++;
  }
  STOP();
 Delay5Ms_OPEN();
 LPM3;
 
  return 0;
}

/*************************************************
  函数(模块)名称:
  功能:	完成24LC01的随机读
  输入参数: 读出数据存入地址,被读数据地址	          		
  输出参数: 0或者1    	
  函数返回值说明: 随机读成功返回0,否则返回1 		
  使用的资源    		
  其它说明: 	
*************************************************/
unsigned char RandomRead(unsigned char *p_date,unsigned char adr)
{
START();
Write8bit(W_DEVICE_ADR);    
Wait_ACK();
if(  ACK_flag==1 )          
  return 1;

Write8bit(adr);            
Wait_ACK();
if(  ACK_flag==1 )          
  return 1;


START();                     
Write8bit(R_DEVICE_ADR);
Wait_ACK();
if(  ACK_flag==1 )          
  return 1;

*p_date=Read8bit();        //读数据
NO_ACK();                  //发送无应答信号
STOP();
return 0;
}
/*************************************************
  函数(模块)名称:
  功能:	完成24LC01的连续读
  输入参数: 读出数据存入地址,被读数据地址,读数据的字节数     	          		
  输出参数: 0或者1    	
  函数返回值说明: 连续读成功返回0,否则返回1 		
  使用的资源    		
  其它说明: 	
*************************************************/

unsigned char Read24LC01(unsigned char *p_date,unsigned char adr,
                         unsigned char nbyte)
{
START();
Write8bit(W_DEVICE_ADR);    
Wait_ACK();
if(  ACK_flag==1 )          
  return 1;

Write8bit(adr);            
Wait_ACK();
if(  ACK_flag==1 )          
  return 1;


START();                     
Write8bit(R_DEVICE_ADR);
Wait_ACK();
if(  ACK_flag==1 )          
  return 1;

while(nbyte-- != 1)          //读(nbyte-1)个字节
  {
  *p_date=Read8bit();        //读数据
   ACK();                    //读完一个字节发送一个应答信号
   p_date++;
  }

*p_date=Read8bit();          //读最后一个数据字节
NO_ACK();                    //发送无应答信号
STOP();
return 0; 
}
//*********************************************
void Delay(unsigned int m)
{
 while(m-- != 0);
}
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

6
 
使用模拟就不要设置IO的特殊功能
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

7
 
谢谢楼上两位高手的支持
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

8
 
IIC  我喜欢
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

9
 
我也刚做完IIC还好成功了,是向eeprom中读写数据折腾了我一周。具体步骤就按照msp430的pdf文件就好,另外在传输数据时加些延时。我就是因为少了个延时在读数据时老是把地址也写进rom中,我在写数据结束后加些延时就解决问题了
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【干货上新】电源解决方案和技术第二趴 | DigiKey 应用探索站
当月好物、电源技术资源、特色活动、DigiKey在线实用工具,干货多多~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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

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

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

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