5245.c

来自「数字电位器AD5245的串口通信程序」· C语言 代码 · 共 179 行

C
179
字号
#include<msp430x14x.h>
#define	SDA_1  (P2OUT|=BIT5);
#define	SDA_0  (P2OUT&=~BIT5);
#define SDA_OUT (P2DIR |=BIT5)
#define SDA_IN (P2DIR &=~BIT5)

#define	SCL_1  (P2OUT|=BIT3);
#define	SCL_0  (P2OUT&=~BIT3);
#define SCL_OUT (P2DIR |=BIT3);
#define SCL_IN (P2DIR &=~BIT3);

void init_cpu(void);
void I2C_init(void);
void I2C_START(void);
void I2C_STOP(void);
void ACK(void);
void NONACK(void);
void TESTACK(void);
void I2C_sendbyte(unsigned char byte);
unsigned char I2C_recvbyte(void);
void I2C_write(unsigned char addr,unsigned char instr,unsigned char data);
unsigned char I2C_read(unsigned char addr);
 unsigned char rdata;
void main()
{
  _DINT();//禁止中断
  WDTCTL = WDTPW +WDTHOLD;//关闭看门狗电路
  init_cpu();  //init cpu
  I2C_init();
   _EINT(); //开启中断
  for(int tmp=0;tmp<1000;tmp++);
  unsigned char waddr=0x58,raddr=0x59,instr=0x00,data=0xF0; 
 
  I2C_write(waddr,instr,data);
  rdata=I2C_read(raddr);
}

void init_cpu(void)//初始化MSP430
{
  int i;
  BCSCTL1 = 0X00;//将寄存器的内容清零//XT2震荡器开启//LFTX1工作在低频模式//ACLK的分频因子为1    
  do
  {
    IFG1 &= ~OFIFG;                       // 清除OSCFault标志
    for (i = 0x20; i > 0; i--);                
   }
  while ((IFG1 & OFIFG) == OFIFG);// 如果OSCFault =1  
  BCSCTL2 = 0X00;   //将寄存器的内容清零
  BCSCTL2 += SELM1;  //MCLK的时钟源为TX2CLK,分频因子为1
  BCSCTL2 += SELS;  //SMCLK的时钟源为TX2CLK,分频因子为1  
  P5SEL |=BIT6;//把P5.6设为外部模块功能
}
 void I2C_init(void)
{
P2SEL&=~BIT3;
P2SEL&=~BIT5;
 SCL_OUT;
 SCL_1;
 SDA_IN;
  
 }

void I2C_START(void)
{
  SDA_OUT;
  SDA_1;
  SCL_1;
   _NOP();
  SDA_0;
  _NOP();
  SCL_0;
  _NOP();
 
}

void I2C_STOP(void)             //停止
{ SDA_OUT;
  SDA_0;
  SCL_1;
  _NOP();
  SDA_1;
  _NOP();
}
void ACK(void)//主机应答信号
{SDA_OUT;
  SDA_0;
  SCL_1;
  _NOP();
  SCL_0;
  _NOP();
  SDA_1;
}
void NONACK(void)//主机反向应答信号
{ SDA_OUT;
  SDA_1;
  SCL_1;
  _NOP();
  SCL_0;
  _NOP();
  
}
void TESTACK(void)//获取从机应答信号
{  
  SDA_1;
  SDA_IN;
  SCL_1;
  _NOP();
  while(P2IN&BIT5);
  SCL_0;
    
}
void I2C_sendbyte(unsigned char byte)
{ 
  unsigned char temp=0x80;
  unsigned char i;
  SDA_OUT;
  for(i=8;i>0;i--)
  {
    if((byte&temp)>0)
    {
      SDA_1;
    }
    else
    {
      SDA_0;
    }
    temp/=2;
    
    _NOP();
    SCL_1;
    _NOP();
    SCL_0;
    _NOP();
   }
}
unsigned char I2C_recvbyte(void)
{
  unsigned char temp=0x80,data=0x00;
  unsigned char i;
  SDA_IN;
 for(i=8;i>0;i--)
 {
   SCL_1;
   _NOP();
   SDA_IN;
  if(P2IN&BIT5)
    data|=temp;
  temp/=2;
   SCL_0;
   _NOP(); 
 }
 return data;
    
}

void I2C_write(unsigned char addr,unsigned char instr,unsigned char data)
{
  I2C_START();
  I2C_sendbyte(addr);
  TESTACK();
  I2C_sendbyte(instr);
  TESTACK();
  I2C_sendbyte(data);
  TESTACK();
  I2C_STOP();
}

unsigned char I2C_read(unsigned char addr)
{
  unsigned char temp=0x00;
  I2C_START();
  I2C_sendbyte(addr);
  TESTACK();
  temp=I2C_recvbyte();
  NONACK();
  I2C_STOP();
  return temp;
}

⌨️ 快捷键说明

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