⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iic.c

📁 让模拟示波器显示任意字符和图片 采用MSP430系列单片机开发
💻 C
字号:
/******************************************************************************
*                           FILE NAME  IIC.C 
*I2C 主要函数:
*向从机地址为WSLA,子地址为addr 的寄存器发送数据 *buf,数据长度为len
*void TWI_write(unsigned char WSLA,unsigned char addr,unsigned char *buf,unsigned 
*               char len)
*
*从从机地址为WSLA,子地址为addr 的寄存器读取数据 传回*buf,数据长度为len
*void TWI_read(unsigned char WSLA,unsigned char addr,unsigned char *buf,
*                       unsigned char len)                  
*****************************************************************************/


/******************************************************************************
*                                定义管脚
*                        P3.1 ---------------SDA
*                        P3.3 ---------------SCL
******************************************************************************/

#include <msp430x16x.h>
#include "IIC.h"
#include "delay.h"



/***********************************************************************
** 函数名称: 	I2C_Set_sck_high
** 功能描述: 	时钟线置1
** 输 入: 	无     
** 输 出:      无
** 全局变量:	无
** 调用模块: 	无
***********************************************************************/
void I2C_Set_sck_high(void)
{
  P3OUT |= SCL;
}

/***********************************************************************
** 函数名称: 	I2C_Set_sck_low
** 功能描述: 	时钟线置0
** 输 入:	无     
** 输 出:      无
** 全局变量:	无
** 调用模块: 	无
***********************************************************************/
void I2C_Set_sck_low(void)
{
  P3OUT &=~(SCL);
}


/***********************************************************************
** 函数名称: 	I2C_Set_sda_high
** 功能描述: 	数据线置1
** 输 入: 	无     
** 输 出:      无
** 全局变量:	无
** 调用模块: 	无
***********************************************************************/
void I2C_Set_sda_high(void)
{
  P3OUT |=SDA;
}



/***********************************************************************
** 函数名称: 	I2C_Set_sda_low
** 功能描述: 	数据线置0
** 输 入:	无     
** 输 出:      无
** 全局变量:	无
** 调用模块: 	无
***********************************************************************/
void I2C_Set_sda_low(void)
{
  P3OUT &=~(SDA);
}




/***********************************************************************
** 函数名称: 	I2C_Initial
** 功能描述: 	I2C端口初始化,及时钟线,数据线初始化
** 输 入: 	无     
** 输 出:      无
** 全局变量:	无
** 调用模块: 	I2C_Set_sda_high  I2C_Set_sck_high
***********************************************************************/
void I2C_Initial(void)
{
  unsigned char j;
  P3DIR |= SCL;
  I2C_Set_sck_high();
  
  for(j=30;j>0;j--);
  P3DIR |= SDA;
  I2C_Set_sda_high();
  for(j=30;j>0;j--);
}


/***********************************************************************
** 函数名称: 	I2C_GetAck
** 功能描述: 	主机读取ACK信号的函数
** 输 入: i :	无     
** 输 出: unsigned char   输出1 读到ACK值 输出0 未读到ACK值
** 全局变量:	无
** 调用模块: 	I2C_Set_sda_high  I2C_Set_sck_high
**              I2C_Set_sda_low   I2C_Set_sck_low
***********************************************************************/
unsigned char  I2C_GetAck(void)
{
  unsigned char nTemp=0;
  unsigned char  j;
  I2C_Set_sda_high();
  for(j=30;j>0;j--);
  P3DIR &=~(SDA);
  I2C_Set_sck_high();
  
  
  for(j=30;j>0;j--);
  nTemp=P3IN & SDA;//获得数据
  
  I2C_Set_sck_low();
  for(j=30;j>0;j--);
  P3DIR |= SDA;
  return(nTemp & SDA);
}



/***********************************************************************
** 函数名称: 	I2C_SetAck
** 功能描述: 	主机发送ACK信号的函数
** 输 入: 	unsigned char ack :1 设置ACK 0 设置NACK     
** 输 出:      无
** 全局变量:	无
** 调用模块: 	I2C_Set_sda_high  I2C_Set_sck_high
**              I2C_Set_sda_low   I2C_Set_sck_low
***********************************************************************/
void I2C_SetAck(unsigned char ack)
{
  unsigned char j;
  if(ack == 1)
  {
       I2C_Set_sda_high();
       for(j=30;j>0;j--);
  }
  else
  {
       I2C_Set_sda_low();
       for(j=30;j>0;j--);
  } 
  I2C_Set_sck_high();
  for(j=30;j>0;j--);
  I2C_Set_sck_low();
  for(j=30;j>0;j--);
}


/***********************************************************************
** 函数名称: 	I2C_Start
** 功能描述: 	主机发送START信号
** 输 入: 	无     
** 输 出:      无
** 全局变量:	无
** 调用模块: 	I2C_Set_sda_high  I2C_Set_sck_high
**              I2C_Set_sda_low   I2C_Set_sck_low
***********************************************************************/
void I2C_Start(void)
{
  int i;
  
  I2C_Set_sda_high();
  for(i=30;i>0;i--);
  I2C_Set_sck_high();
  for(i=30;i>0;i--);
  I2C_Set_sda_low();
  for(i=30;i>0;i--);
  I2C_Set_sck_low();
  for(i=30;i>0;i--);     
}


/***********************************************************************
** 函数名称: 	I2C_Stop
** 功能描述: 	主机发送STOP信号
** 输 入: 	无     
** 输 出:      无
** 全局变量:	无
** 调用模块: 	I2C_Set_sda_high  I2C_Set_sck_high
**              I2C_Set_sda_low   I2C_Set_sck_low
***********************************************************************/
void I2C_Stop(void)
{
  int i;
  
  I2C_Set_sda_low();
  for(i=30;i>0;i--);
  I2C_Set_sck_high();
  for(i=30;i>0;i--);
  I2C_Set_sda_high();
  for(i=30;i>0;i--);
  Delay_Ms(10);
  
  return;
}



/***********************************************************************
** 函数名称: 	I2C_TxhTol
** 功能描述: 	主机发送一字节数据 MSB FIRST
** 输 入: 	unsigned char nValue   发送的数据   
** 输 出:      无
** 全局变量:	无
** 调用模块: 	I2C_Set_sda_high  I2C_Set_sck_high
**              I2C_Set_sda_low   I2C_Set_sck_low
***********************************************************************/
void I2C_TxhTol(unsigned char nValue)
{
  unsigned char q0,i,j;
  P3DIR |= SDA;
  for(i=0;i<8;i++)
  {
    q0=nValue & 0x80;
    if(q0==0x80)
      I2C_Set_sda_high();
    else
      I2C_Set_sda_low();
    for(j=30;j>0;j--);
    I2C_Set_sck_high();
    for(j=30;j>0;j--);
    I2C_Set_sck_low();
    for(j=30;j>0;j--);
    nValue=nValue << 1;
  }
  return;
}


/***********************************************************************
** 函数名称: 	I2C_RxByte
** 功能描述: 	主机读取一字节数据 
** 输 入: 	无   
** 输 出:      unsigned char  返回读回的数据
** 全局变量:	无
** 调用模块: 	I2C_Set_sda_high  I2C_Set_sck_high
**              I2C_Set_sda_low   I2C_Set_sck_low
***********************************************************************/
unsigned char I2C_RxByte(void)
{
  unsigned char i,j,q0,nTemp=0;
  I2C_Set_sda_high();
  for(j=30;j>0;j--);
  
  for(i=0;i<8;i++)
  {
    I2C_Set_sck_high();
    for(j=30;j>0;j--);
    nTemp = (nTemp << 1);
    P3DIR &=~(SDA);//将SDA管脚设置为输入方向
    q0 = ( P3IN & SDA );
    if(q0 == SDA)
      nTemp |= 0x01;
    //for(j=30;j>0;j--);
    I2C_Set_sck_low();
    for(j=30;j>0;j--);
  } 
  return nTemp;
}


/***********************************************************************
** 函数名称: 	TWI_write
** 功能描述: 	主机向从机地址为 WSLA  寄存器地址为 addr 的寄存器发送
**              len 字节数据  数据头指针为*buf
** 输 入: 	WSLA 从机读地址  addr 从机寄存器地址
**              *buf 指向发送数据的指针 len 字节数
** 输 出:      无
** 全局变量:	无
** 调用模块: 	I2C_GetAck I2C_SetAck I2C_Start I2C_Stop I2C_TxhTol
***********************************************************************/
void TWI_write(unsigned char WSLA,unsigned char addr,unsigned char *buf,unsigned 
               char len)
{
  unsigned char i;
  unsigned char nTemp = 0;
  nTemp = nTemp;
  I2C_Start();
  I2C_TxhTol(WSLA);
  nTemp = I2C_GetAck();
  I2C_TxhTol(addr);
  nTemp = I2C_GetAck();
  for(i=0;i<len;i++)
   {
      I2C_TxhTol(buf[i]);
      nTemp = I2C_GetAck();
   }
   I2C_Stop();
}
/***********************************************************************
** 函数名称: 	TWI_read
** 功能描述: 	主机从从机地址为 WSLA  寄存器地址为 addr 的寄存器读取
**              len 字节数据  读取的数据存入指针为*buf的地址
** 输 入: 	WSLA 从机读地址  addr 从机寄存器地址
**              *buf 指向存放读取数据地址的指针 len 字节数
** 输 出:      无
** 全局变量:	无
** 调用模块: 	I2C_GetAck I2C_SetAck I2C_Start I2C_Stop I2C_TxhTol
**              I2C_RxByte
***********************************************************************/
void TWI_read(unsigned char WSLA,unsigned char addr,unsigned char *buf,
                       unsigned char len)
{
 unsigned char i;
 unsigned char nTemp=0;
 nTemp = nTemp;
 TWI_write(WSLA,addr,0,0);
 Delay_Ms(1);
 I2C_Start();
 I2C_TxhTol(WSLA+1);
 nTemp=I2C_GetAck();
 for(i=0;i<len-1;i++)
 {
    buf[i]=I2C_RxByte();
    I2C_SetAck(1);
 }
 
  buf[i]=I2C_RxByte();
 I2C_SetAck(0);
 
 I2C_Stop();
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -