msp430f149+ds3231 模拟iic没有sda信号是怎么回事呢?

qq_39535875 2017-09-19 04:26:49
本人新手 可能存在的问题比较多 请大神多多指出

#define DS_SCL BIT4 //DS_SCL = P5.4
#define DS_SDA BIT6 //DS_SDA = P2.6
#define DS_SCL_IN P5DIR &= ~DS_SCL
#define DS_SCL_OUT P5DIR |= DS_SCL
#define DS_SCL0 P5OUT &= ~DS_SCL
#define DS_SCL1 P5OUT |= DS_SCL
#define DS_SDA_IN P2DIR &= ~DS_SDA
#define DS_SDA_OUT P2DIR |= DS_SDA
#define DS_SDA0 P2OUT &= ~DS_SDA
#define DS_SDA1 P2OUT |= DS_SDA
#define DS_SDA_BIT P2IN & DS_SDA

void Init_CLK(void)
{
unsigned int i;
BCSCTL1 &= ~XTS;
do{
IFG1 &= ~OFIFG;
for(i=0xFF;i>0;i--);
}
while((IFG1 & OFIFG)!=0);
BCSCTL2 |= SELS+SELM1;
_EINT();
P5SEL|=0x30;
DS_SCL_OUT; //SCLK对应的IO设置为输出状态
P2DIR&=0xbf;
P2OUT|=BIT6;
DS_SCL0; //SCLK=0
delay_us(5);
}

void DS3231_Write(u8 write_address,u8 write_data)
{
u8 Device_Address = 0xD0; //DS3231写设备地址
iic_Start(); //开始
iic_SendByte(Device_Address); //发送设备地址
iic_Ack();

iic_SendByte(write_address); //发送地址
iic_Ack(); //应答

iic_SendByte(write_data); //发送数据
iic_Ack(); //应答

iic_Stop(); //停止
}

u8 DS3231_Read(u8 read_address)
{
u8 Receive_Data; //数据接收
u8 Device_Address = 0xD0; //DS3231写设备地址

iic_Start(); //开始
iic_SendByte(Device_Address); //发送设备地址
iic_Ack(); //应答

iic_SendByte(read_address); //发送地址
iic_Ack(); //应答

iic_Start(); //重复开始
Device_Address = 0xD1; //DS3231读设备地址
iic_SendByte(Device_Address); //发送地址
iic_Ack(); //应答

iic_in();
Receive_Data = iic_ReceiveByte(); //接收数据
iic_out();
iic_NAck(); //不应答

iic_Stop(); //停止

return Receive_Data; //返回数据
}

void delay_us(u8 time)
{
for(int i=0;i<time;i++)
_NOP();
}

//------------iic开始-----------
void iic_Start(void)
{
DS_SDA_OUT;
DS_SCL_OUT;

DS_SCL1;
delay_us(5);
DS_SDA1;
delay_us(10);
DS_SDA0;
delay_us(5);
DS_SCL0;
delay_us(5);
DS_SDA_IN;

}

//------------iic结束-----------
void iic_Stop(void)
{ DS_SDA_OUT;
DS_SCL_OUT;
DS_SCL1;
delay_us(10);
DS_SDA0;
delay_us(5);
DS_SDA1;
delay_us(5);
DS_SDA_IN;
}

//------------iic应答-----------
void iic_Ack(void)
{
DS_SCL0;
DS_SDA0;
delay_us(5);
DS_SCL1;
delay_us(5);
DS_SCL0;
delay_us(5);

}

//------------iic不应答---------
void iic_NAck(void)
{
DS_SCL0;
DS_SDA1;
delay_us(5);
DS_SCL1;
delay_us(5);
DS_SCL0;
delay_us(5);

}

//------------iic发送-----------
void iic_SendByte(u8 SendData)
{
DS_SDA_OUT;
DS_SCL_OUT;
DS_SCL0;
u8 i;
for(i=0;i<8;i++)
{
DS_SCL0;
delay_us(5);
if(SendData&0x80) //MSB在前
DS_SDA1;
else
DS_SDA0;
DS_SCL1;
delay_us(2);
DS_SCL0;
SendData<<=1;
}

//delay_us(5);
//DS_SDA1;
//delay_us(5);
//DS_SDA_IN;
}

//------------iic接收-----------
u8 iic_ReceiveByte(void)
{
u8 i,temp=0;
delay_us(5);
DS_SDA1;
delay_us(5);
for(i=0;i<8;i++)
{
temp<<=1;
DS_SCL0;
delay_us(5);
DS_SCL1;
delay_us(2);
temp=DS_SDA_BIT;
if(temp==0x80)
temp=temp|0x01;
else
temp=temp&0xFE;
}
DS_SCL0;
delay_us(2);
return temp;
}
void iic_in()
{
DS_SCL_OUT;

DS_SDA_IN;
}

void iic_out()
{
DS_SCL_OUT;
DS_SDA_OUT;

DS_SCL1;
delay_us(5);
DS_SDA1;
delay_us(2);
}
...全文
250 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianxj001 2017-09-19
  • 打赏
  • 举报
回复
你这个IIC写的太乱了,实在难以看下去,给你个参考吧,我自己用过的软IIC程序,AIR平台,STM8芯片

#define	ADS1115_ADD		0X90			
#define SCL              PB_ODR_ODR4
#define SDA              PB_ODR_ODR5
#define SDA_IN           PB_IDR_IDR5
#define SET_SCL_OUT()	{PB_DDR_DDR4=1;PB_CR1_C14=0;PB_CR2_C24=0;}
#define SET_SDA_OUT()	{PB_DDR_DDR5=1;PB_CR1_C15=0;PB_CR2_C25=0;}
#define SET_SDA_IN()	{PB_DDR_DDR5=0;PB_CR1_C15=0;PB_CR2_C25=0;}

void Init_IIC(void)
   {
	  I2C_CR1 &= 0xFE;      //  PE=0, disable IIC module  
	  SET_SDA_OUT();
	  SDA=1;
	  SET_SCL_OUT();
	  SCL=1;
   }

//--------------------------------------------------------------
//IIC主时钟定时用延时函数
//--------------------------------------------------------------
void Delay_CLK()
   {
	  NOP();NOP();NOP();NOP();NOP();
   }

//--------------------------------------------------------------
//IIC 启动信号发送
//--------------------------------------------------------------
void IIC_Start(void)
   {
	  SDA = 0;                   
	  Delay_CLK();                
	  SCL = 0;                    
   }

//--------------------------------------------------------------
//IIC 停止信号发送
//-------------------------------------------------------------- 
void IIC_Stop(void)
   {
	  SDA = 1;                   
	  Delay_CLK();                
	  SCL = 1;
   }

//--------------------------------------------------------------
//MASTER模式 发送ACK应答
//--------------------------------------------------------------
void IIC_SendACK(u8 ACK)
   {
	  SDA = ACK;
	  SCL = 1;                   
	  Delay_CLK(); 
	  Delay_CLK();
	  SCL = 0;
   }

//--------------------------------------------------------------
//IIC单字节发送+ACK检测
//--------------------------------------------------------------

u8 IIC_SendByte(u8 Send_DAT)
   {
	  u8	CHK_ACK;
	  for (u8 i=0;i<8;i++)         
		 {
			SCL = 0;                
			Delay_CLK();
			SDA=Send_DAT>>7;
			Send_DAT <<=  1;
			SCL = 1;                
			Delay_CLK();Delay_CLK(); 
		 } 
	  SCL = 0;                
	  Delay_CLK();
	  SET_SDA_IN();
	  Delay_CLK(); 
	  SCL = 1;    
	  CHK_ACK = (u8)SDA_IN;
	  SET_SDA_OUT();
	  Delay_CLK();   
	  SCL = 0;   
	  Delay_CLK();  
	  return CHK_ACK;	
   }

//--------------------------------------------------------------
//IIC 单字节接受
//--------------------------------------------------------------
u8 IIC_RecvByte()
   {
	  u8 Recv_DAT = 0;
	  SDA = 1;     
	  SET_SDA_IN();
	  for (u8 i=0; i<8; i++)         
		 { 
			Recv_DAT <<= 1;
			SCL = 1;
			Delay_CLK(); 
			Recv_DAT+=(u8)SDA_IN;	
			NOP();NOP();
			SCL = 0;                
			Delay_CLK();  
		 }
	  SET_SDA_OUT();
	  return Recv_DAT;
   }

//--------------------------------------------------------------
//ADS1115 写控制项
//--------------------------------------------------------------
void config_ads1115(u8 regadd,u8 wdata,u8 wdata1)
   {
	  IIC_Start();
	  IIC_SendByte(ADS1115_ADD);//根据需要,这里可以加上ACK检测
	  IIC_SendByte(regadd);
	  IIC_SendByte(wdata);
	  IIC_SendByte(wdata1);
	  IIC_Stop();             
   }
//--------------------------------------------------------------
//ADS1115 读转换结果
//--------------------------------------------------------------
int Read_ads1115(u8 REG_ADD)
   {
	  int READ_TMP;
	  IIC_Start();            
	  IIC_SendByte(ADS1115_ADD);   //写地址为7位器件地址+读写位=0   
	  IIC_SendByte(REG_ADD); 
	  IIC_Stop();
	  IIC_Start();    
	  IIC_SendByte(ADS1115_ADD|1); //读地址为7位器件地址+读写位=1   
	  *((u8*)(&READ_TMP))= IIC_RecvByte();
	  IIC_SendACK(0);
	  *((u8*)(&READ_TMP)+1)= IIC_RecvByte();
	  IIC_SendACK(0);
	  IIC_Stop();
	  return READ_TMP;
   }

Hyperledger (超级账本)是区块链行业中最大的项目之一,它由一组开源工具和多个子项目组成。该项目是由 Linux 基金会主办的一个全球协作项目,其中包括一些不同领域的LEADER们,这些leader的目标是建立一个强大的、业务驱动的区块链框架。 区块链网络主要有三种类型:公共区块链、联盟或联合区块链,以及私有区块链。Hyperledger 是一个区块链框架,旨在帮助公司建立私人或联盟许可的区块链网络,在该网络中,多个组织可以共享控制和操作网络内节点的权限。 因为区块链是一个透明的,基于不可变模式的安全的去中心化系统,所以它被认为是传统的供应链行业改变游戏规则的一种解决方案。它可以通过以下方式支持有效的供应链系统: 跟踪整个区块链中的产品 校验和验证区块链中的产品 在供应链参与者之间共享整个区块链的信息 提供可审核性 本文通过食品供应链的例子来解释 Hyperledger 区块链是如何改变传统供应链系统的。 食品行业供应链 传统供应链效率低下的主要原因是由于缺乏透明度而导致报告不可靠和竞争上的劣势。 在传统的供应链模式中,有关实体的信息对该区块链中的其他人来说并不完全透明,这就导致了不准确的报告和缺乏互操作性问题。电子邮件和印刷文档提供了一些信息,但它们不可能包含完整详细的可见性数据,因为很难在整个供应链中去追踪产品。这也使消费者几乎不可能知道产品的真正价值和来源。 食品行业的供应链环境复杂,多个参与者需要协作将货物运送到最终目的地 —— 客户手中。下图显示了食品供应链(多级)网络中的主要参与者。  典型的食品供应链 该区块链的每个阶段都会引入潜在的安全问题、整合问题和其他低效问题。目前食品供应链中的主要威胁仍然是假冒食品和食品欺诈。 基于 Hyperledger 区块链的食品跟踪系统可实现对食品信息全面的可视性和和可追溯性。更重要的是,它以一种不变但可行的方式来记录产品细节,确保食品信息的真实性。最终用户通过在不可变框架上共享产品的详细信息,可以自我验证产品的真实性。 Hyperledger Fabric Hyperledger Fabric 是 Hyperledger 项目的基石。它是基于许可的区块链,或者更准确地说是一种分布式分类帐技术(DLT),该技术最初由 IBM 公司和 Digital Asset 创建。分布式分类帐技术被设计为具有不同组件的模块化框架(概述如下)。它也是提供可插入的共识模型的一种灵活的解决方案,尽管它目前仅提供基于投票的许可共识(假设今天的 Hyperledger 网络在部分可信赖的环境中运行)。 鉴于此,无需匿名矿工来验证交易,也无需用作激励措施的相关货币。所有的参与者必须经过身份验证才能参与到该区块链进行交易。与以太坊一样,Hyperledger Fabric 支持智能合约,在 Hyperledger 中称为Chaincodes(链码),这些合约描述并执行系统的应用程序逻辑。 然而,与以太坊不同,Hyperledger Fabric 不需要昂贵的挖矿计算来提交交易,因此它有助于构建可以在更短的延迟内进行扩展的区块链。 Hyperledger Fabric 不同于以太坊或比特币这样的区块链,不仅在于它们类型不同,或者说是它与货币无关,而且它们在内部机制方面也不同。以下是典型的 Hyperledger 网络的关键要素: 账本(Ledgers):存储了一系列块,这些块保留了所有状态交易的所有不可变历史记录。 节点(Nodes):区块链的逻辑实体。它有三种类型: 客户端(Clients):是代表用户向网络提交事务的应用程序。 对等体(Peers):是提交交易并维护分类帐状态的实体。 排序者(Orderers) 在客户端和对等体之间创建共享通信渠道,还将区块链交易打包成块发送给遵从的对等体节点。 除了这些要素,Hyperledger Fabric 还有以下关键设计功能: 链码(Chaincode):类似于其它诸如以太坊的网络中的智能合约。它是用一种更高级的语言编写的程序,在针对分类帐当前状态的数据库执行。 通道(Channels):用于在多个网络成员之间共享机密信息的专用通信子网。每笔交易都在一个只有经过身份验证和授权的各方可见的通道上执行。 背书人(Endorsers) 验证交易,调用链码,并将背书的交易结果返回给调用应用程序。 成员服务提供商(Membership Services Providers)(MSP)通过颁发和验证证书来提供身份验证和身份验证过程。MSP 确定信任哪些证书颁发机构(CA)去定义信任域的成员,并确定成员可能扮演的特定角色(成员、管理员等)。 Hyperledger 交易验证流程 首先,客户端通过向基于 Hyperledger Fabric 的应用程序客户端发送请求来启动交易,该客户端将交易提议提交给背书对等体。这些对等体通过执行由交易指定的链码(使用该状态的本地副本)来模拟该交易,并将结果发送回应用程序。此时,应用程序将交易与背书相结合,并将其广播给 排序服务(Ordering Service)。排序服务检查背书并为每个通道创建一个交易块,然后将其广播给通道中的其它节点,对的体验证该交易并进行提交。 Hyperledger Fabric 区块链可以通过透明的、不变的和共享的食品来源数据记录、处理数据,及运输细节等信息将食品供应链中的参与者们连接起来。链码由食品供应链中的授权参与者来调用。所有执行的交易记录都永久保存在分类帐中,所有参与者都可以查看此信息。 Hyperledger Composer 除了 Fabric 或 Iroha 等区块链框架外,Hyperledger 项目还提供了 Composer、Explorer 和 Cello 等工具。 Hyperledger Composer 提供了一个工具集,可帮助你更轻松地构建区块链应用程序。 它包括: CTO,一种建模语言 Playground,一种基于浏览器的开发工具,用于快速测试和部署 命令行界面(CLI)工具 Composer 支持 Hyperledger Fabric 的运行时和基础架构,在内部,Composer 的 API 使用底层 Fabric 的 API。Composer 在 Fabric 上运行,这意味着 Composer 生成的业务网络可以部署到 Hyperledger Fabric 执行。 

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧