智能车制作
标题:
STM32软件模拟I2C程序中有问题?
[打印本页]
作者:
huster_tjs
时间:
2015-10-25 16:20
标题:
STM32软件模拟I2C程序中有问题?
我在用软件模拟I2C过程中,写入硬件写地址(address)和数据(data)都是正确的,能够得到waitask响应。在waitask响应后master将SCL电平拉低,SDA电平自动释放(高电平)。这些都正确。
但是当我写入硬件读地址(address+1)的时候,能得到waitask响应,但是响应后我master拉低SCL电平后,SDA电平还是被拉低,即使通过master软件拉高SDA的IO口都不能将之电平拉高。因此可知,写入硬件读地址(address+1)后,能得到正确的的响应,但是slave就是不释放SDA数据端口。这是怎么回事呢,哪里出了问题?
下面是一些代码:
//单字节读取*****************************************
unsigned char I2C_ReadByte(unsigned char REG_Address)
{
unsigned char REG_data;
if(!I2C_Start())return FALSE;
I2C_SendByte(SlaveAddress);
if(!I2C_WaitAck()){I2C_Stop(); return FALSE;}
I2C_SendByte((u8) REG_Address); //设置低起始地址
I2C_WaitAck();
I2C_Start();
I2C_SendByte(SlaveAddress+1); //就是这里发送读地址
I2C_WaitAck(); //这个waitack里面出问题,最后的scl拉低,slave不释放SDA电平
REG_data= I2C_ReceiveByte();
I2C_NoAck();
I2C_Stop();
//return TRUE;
return REG_data;
}
//这里就是waitack()
bool I2C_WaitAck(void) //返回为:=1有ACK,=0无ACK
{
SCL_L;
I2C_delay();
SDA_H;
I2C_delay();
SCL_H;
I2C_delay();
if(SDA_read)
{
SCL_L;
I2C_delay();
return FALSE;
}
SCL_L; //这里拉低SCL电平,但是slave不释放sda(一直是低电平)
I2C_delay();
return TRUE;
}
unsigned char I2C_ReceiveByte(void) //数据从高位到低位//
{
u8 i=8;
u8 ReceiveByte=0;
SDA_H; //slave一直拉低sda,在这master写入SDA高电平都不能将SDA电平拉高
I2C_delay();
while(i--)
{
ReceiveByte<<=1;
SCL_L;
I2C_delay();
SCL_H;
I2C_delay();
if(SDA_read)
{
ReceiveByte|=0x01;
}
}
SCL_L;
return ReceiveByte;
}
求帮助,这是哪问题呢
作者:
huster_tjs
时间:
2015-10-25 17:39
这么有意思的问题怎么没有人回答呢????
补充点:
也就是说,在从写入addr+R后,从机将sda线拉低响应了,但是将scl设置为低电平时,从机不释放sda线(还是低电平)。。。。
而前面写入addr+w后,没出现这种问题。在从机响应拉低了sda后,我将scl设置低电平时,sda将被释放(处于高电平)。。。
作者:
huster_tjs
时间:
2015-10-28 20:52
la9998372 发表于 2015-10-25 22:03
你GPIO口怎么配置的呀?
#define SCL_H GPIOB->BSRR = GPIO_Pin_6
#define SCL_L GPIOB->BRR = GPIO_Pin_6
#define SDA_H GPIOB->BSRR = GPIO_Pin_7
#define SDA_L GPIOB->BRR = GPIO_Pin_7
#define SCL_read GPIOB->IDR & GPIO_Pin_6
#define SDA_read GPIOB->IDR & GPIO_Pin_7
欢迎光临 智能车制作 (http://dns.znczz.com/)
Powered by Discuz! X3.2