共2条
1/1 1 跳转至页
F149,I2C 【求助】F149模拟I2C的问题(收不到应答)
问
我最近在用P口模拟I2C 通信。但总是不成功。
用F149 的端口模拟IIC与F169 通信。其中,F169 为从机。但是在F149总是接受不到F169 的应答信号。4.7k上拉电阻. 示波器观测输出地址信号正确.延时DELAY从1到10都试过.
调试了一星期,一点结果都没有.是不是有某些地方没注意到?请各位有过I2C经验的指点指点.
#include "MSP430x14x.h"
//P3.2 SCL
//P3.3 SDA
#define SDA_1 P3DIR &=~ BIT3 //SDA = 1
#define SDA_0 P3DIR |= BIT3 //SDA = 0
#define SCL_1 P3DIR &= ~BIT2 //SCL = 1
#define SCL_0 P3DIR |= BIT2 //SCL = 0
#define DIR_IN P3DIR &= ~BIT3 //I/O口为输入
#define SDA_IN ((P3IN >> 3) & 0x01) //Read SDA 判断是否为1
void Delay(unsigned int n)
{
unsigned int i;
for (i=0; i<n; i++) {;}
}
void Start(void) //开始
{
SDA_1;
Delay(1);
SCL_1;
Delay(2);
SDA_0;
Delay(1);
SCL_0;
Delay(1);
}
void Stop(void) //结束
{
SDA_0;
Delay(1);
SCL_1;
Delay(1);
SDA_1;
Delay(1);
SCL_0;
}
void WriteByte(unsigned char WriteData) //写一个字节
{
unsigned char i;
for (i=0; i<8; i++)
{
if (((WriteData >> 7) & 0x01) == 0x01)
{
SDA_1;
}
else
{
SDA_0;
}
SCL_1;
WriteData = WriteData << 1;
Delay(1);
SCL_0;
SDA_1;
}
}
void ReceiveAck(void)//接受应答
{
unsigned char i = 0;
Delay(10);
SDA_1;
SCL_1;
Delay(20);
DIR_IN;
while ((SDA_IN == 0x01 /*sda==1*/) && (i < 255))
{
i++;
if(i==254)//超时亮灯
{
P1DIR |= 0x01;
P1OUT |= 0x01;
}
}
SCL_0;
Delay(1);
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
BCSCTL1 |= XT2OFF;//关XT2
BCSCTL2 = SELS+SELM_2;//配置时钟
P3DIR = BIT2+BIT3;
P3OUT &= ~BIT2;//初始输出为0
P3OUT &= ~BIT3;
SCL_0;
while(1)
{
SCL_0;
Start();
WriteByte(0x91);
ReceiveAck();
Stop();
Delay(100);//观察用
}
} 答 1: 请参考下面资料 答 2: 谢谢斑竹,解决了!
用F149 的端口模拟IIC与F169 通信。其中,F169 为从机。但是在F149总是接受不到F169 的应答信号。4.7k上拉电阻. 示波器观测输出地址信号正确.延时DELAY从1到10都试过.
调试了一星期,一点结果都没有.是不是有某些地方没注意到?请各位有过I2C经验的指点指点.
#include "MSP430x14x.h"
//P3.2 SCL
//P3.3 SDA
#define SDA_1 P3DIR &=~ BIT3 //SDA = 1
#define SDA_0 P3DIR |= BIT3 //SDA = 0
#define SCL_1 P3DIR &= ~BIT2 //SCL = 1
#define SCL_0 P3DIR |= BIT2 //SCL = 0
#define DIR_IN P3DIR &= ~BIT3 //I/O口为输入
#define SDA_IN ((P3IN >> 3) & 0x01) //Read SDA 判断是否为1
void Delay(unsigned int n)
{
unsigned int i;
for (i=0; i<n; i++) {;}
}
void Start(void) //开始
{
SDA_1;
Delay(1);
SCL_1;
Delay(2);
SDA_0;
Delay(1);
SCL_0;
Delay(1);
}
void Stop(void) //结束
{
SDA_0;
Delay(1);
SCL_1;
Delay(1);
SDA_1;
Delay(1);
SCL_0;
}
void WriteByte(unsigned char WriteData) //写一个字节
{
unsigned char i;
for (i=0; i<8; i++)
{
if (((WriteData >> 7) & 0x01) == 0x01)
{
SDA_1;
}
else
{
SDA_0;
}
SCL_1;
WriteData = WriteData << 1;
Delay(1);
SCL_0;
SDA_1;
}
}
void ReceiveAck(void)//接受应答
{
unsigned char i = 0;
Delay(10);
SDA_1;
SCL_1;
Delay(20);
DIR_IN;
while ((SDA_IN == 0x01 /*sda==1*/) && (i < 255))
{
i++;
if(i==254)//超时亮灯
{
P1DIR |= 0x01;
P1OUT |= 0x01;
}
}
SCL_0;
Delay(1);
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
BCSCTL1 |= XT2OFF;//关XT2
BCSCTL2 = SELS+SELM_2;//配置时钟
P3DIR = BIT2+BIT3;
P3OUT &= ~BIT2;//初始输出为0
P3OUT &= ~BIT3;
SCL_0;
while(1)
{
SCL_0;
Start();
WriteByte(0x91);
ReceiveAck();
Stop();
Delay(100);//观察用
}
} 答 1: 请参考下面资料 答 2: 谢谢斑竹,解决了!
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |