历史上的今天
今天是:2025年05月20日(星期二)
2018年05月20日 | MSP430学习的第一个模拟I2C程序
2018-05-20 来源:eefocus
#include
unsigned char I2CBUF;
unsigned char checkbit;
#define SCL_H (P10OUT |= BIT2) // P10.2为SCL
#define SCL_L (P10OUT &= ~BIT2)
#define SDA_H (P10OUT |= BIT1) //p10.1为SDA
#define SDA_L (P10OUT &= ~BIT1)
#define SDA_OUT (P10DIR |= BIT1)
#define SDA_IN (P10DIR &= ~ BIT1)
void I2C_Start(void) //I2C开始信号
{
SDA_OUT;
SCL_L;
SDA_H;
__delay_cycles(5);
SCL_H;
__delay_cycles(5);
SDA_L;
__delay_cycles(5);
SCL_L;
__delay_cycles(5);
}
unsigned char testACK(void) {
SDA_IN;
__delay_cycles(5);
SCL_H;
__delay_cycles(5);
checkbit = (P10IN & BIT1) >> 4;
__delay_cycles(5);
SCL_L;
__delay_cycles(5);
return (checkbit);
}
void I2C_ACK(void) //应答信号
{
SDA_OUT;
SCL_L;
SDA_L;
__delay_cycles(5);
SCL_H;
__delay_cycles(5);
SCL_L;
__delay_cycles(5);
SDA_H;
}
void I2C_NACK(void) {
SDA_OUT;
SDA_H;
__delay_cycles(5);
SCL_H;
__delay_cycles(5);
SCL_L;
__delay_cycles(5);
}
void I2C_STOP(void) //产生结束信号
{
SCL_L;
__delay_cycles(5);
SDA_L;
__delay_cycles(5);
SCL_H;
__delay_cycles(5);
SDA_H;
__delay_cycles(5);
}
void I2C_WRITE(unsigned char data)
{
SDA_OUT;
unsigned char i;
for (i = 8; i > 0; i--) //高位循环8次,发送1个字节数据
{
if (data & 0x80) //判断数据高位是0还是1
{
SDA_H; //高位数据写1
}
else
{
SDA_L;
}
SCL_H;
__delay_cycles(5); //发送数据
SCL_L;
__delay_cycles(5);
data <<= 1;
}
}
unsigned char I2C_READ(void)
{
unsigned char j;
unsigned char BUFFER = 0X00;
SDA_IN;
for (j = 8; j >0; j--) //高位循环8次,发送1个字节数据
{
SCL_H;
__delay_cycles(5);
BUFFER <<= 1;
if ((P10IN & BIT1) == BIT1) //判断数据高位是0还是1
{
BUFFER |= 0X01; //高位数据写1
}
else
{
BUFFER |= 0XFE;
}
__delay_cycles(5); //发送数据
SCL_L;
__delay_cycles(5);
}
return BUFFER;
}
void C16_WRITEDATA(unsigned char address, unsigned char DATA)
{
I2C_Start();
I2C_WRITE(address);
testACK();
I2C_ACK();
I2C_WRITE(0x00);
testACK();
I2C_ACK();
I2C_WRITE(DATA);
I2C_STOP();
}
unsigned char C16_READEDATA(unsigned char address)
{
unsigned char READDATA;
I2C_Start();
I2C_WRITE(0XA1);
testACK();
I2C_ACK();
I2C_WRITE(address);
I2C_Start();
testACK();
I2C_ACK();
I2C_WRITE(0XA1);
READDATA = I2C_READ();
I2C_STOP();
return READDATA;
}
int main(void)
{
const int DATA = 0X88;
unsigned char READBUFFER;
WDTCTL = WDTPW + WDTHOLD;
P10DIR |= BIT1 + BIT2;
P2DIR |= BIT0;
P2OUT &= ~BIT0;
C16_WRITEDATA(0X00, DATA);
__delay_cycles(5);
READBUFFER = C16_READEDATA(0X00);
while (1)
{
if (READBUFFER == 0X88)
{
P2OUT |= BIT0;
} else {
P2OUT &= ~ BIT0;
}
__delay_cycles(15);
}
}
上一篇:I2C总线信号时序分析
下一篇:汇编语言源程序的书写格式
史海拾趣
|
GPS系统在出租车行业的应用 GPS系统在出租车行业的应用主要体现在灵活的出租车调度系统中,用户只需要拨打调度中心电话,中心将自动寻找最近的空车,在电话还没挂断之前,便可以告诉乘客“车牌号为XXX的车将在X分钟之内到达。”这种\"叫车服务 ...… 查看全部问答> |
|
第1章 数字电子技术基础 119页.ppt 第2章 组合逻辑电路 136页.ppt 第3章 时序逻辑电路 171页.ppt 第4章 脉冲信号的产生与整形 46页.ppt 第5章 数模和模数转换 29页.ppt 数字电子技术.ppt… 查看全部问答> |
|
奥地利微电子公司日前宣布推出具有自动断电及唤醒模式的磁旋转编码器AS5055。 AS5055主要适用于机器人等低功耗电池供电的应用,同时也适合需要小体积及高分辨率的其他位置检测应用。AS5055集成了4个霍尔传感元件、1个12位角度编码器、1个智能 ...… 查看全部问答> |
|
在调程序的时候老是出错,然后单步跟发现问题出在ldr伪指令上,于是专门写了个汇编文件在arm上跑了一下,发现一个奇怪的现象 开发环境ADS1.2 整个工程就这一个2410.s文件,全部代码如下: Usr_Size EQU 5 AREA  ...… 查看全部问答> |
|
晒一下新到的触屏故障STM32F429I-discovery和修复过程 今天怀着忐忑的心情收到了EE团的STM32F429I-discovery,但是一拆开包装一看 哇一个塞! 包装居然被挤压变形开裂了,不过没事!这种开发板一般都很耐摔 激动的拆开塑料壳上电试一试,结果:怎么触摸屏用不了呢? 然后马上来论坛看到大家有不少 ...… 查看全部问答> |




