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 + -
显示快捷键?