历史上的今天
今天是:2024年10月08日(星期二)
2018年10月08日 | stm32普通IO口模拟iic时序
2018-10-08 来源:eefocus
1,用stm32的普通IO口模拟iic时序,可以用较少的IO口实现iic功能,在实际使用中有很大优势。
2,stm32的IO可以设置为推挽,开漏输出模式,在开漏输出下,如果带上拉电阻,则可以双向传输数据,
如输出1(PCout()=1),从它的输入引脚可以读出状态(PCin()),
这样在不需要配置输入,输出模式,就可以实现iic数据线的写和读。
程序实现过程:
#define AT_IIC_SCL PCout(12)
#define AT_IIC_SDA PCout(11)
#define AT_IIC_SDA_READ PCin(11)
void I2cIoInit()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_12|GPIO_Pin_11);
}
void I2cStart()
{
AT_IIC_SDA=1;
AT_IIC_SCL=1;
delay_us(4);
AT_IIC_SDA=0;
delay_us(4);
AT_IIC_SCL=0;
}
void I2cStop()
{
AT_IIC_SCL=0;
AT_IIC_SDA=0;
delay_us(4);
AT_IIC_SCL=1;
AT_IIC_SDA=1;
delay_us(4);
}
uint8_t I2cWaitAck()
{
uint8_t errTimes=0;
AT_IIC_SDA=1;
delay_us(1);
AT_IIC_SCL=1;
delay_us(1);
while(AT_IIC_SDA_READ)
{
errTimes++;
if(errTimes>250)
{
I2cStop();
return 1;
}
}
AT_IIC_SCL=0;
return 0;
}
void I2cAck()
{
AT_IIC_SCL=0;
AT_IIC_SDA=0;
delay_us(2);
AT_IIC_SCL=1;
delay_us(2);
AT_IIC_SCL=0;
}
void I2cNoAck()
{
AT_IIC_SCL=0;
AT_IIC_SDA=1;
delay_us(2);
AT_IIC_SCL=1;
delay_us(2);
AT_IIC_SCL=0;
}
void I2cSendByte(uint8_t txdata)
{
uint8_t t;
AT_IIC_SCL=0;
for(t=0;t<8;t++)
{
if((txdata&0x80)>>7)
{
AT_IIC_SDA=1;
}
else
{
AT_IIC_SDA=0;
}
txdata<<=1;
delay_us(2);
AT_IIC_SCL=1;
delay_us(2);
AT_IIC_SCL=0;
delay_us(2);
}
}
uint8_t I2cReadByte(uint8_t ack)
{
unsigned char i,receive=0;
for(i=0;i<8;i++ )
{
AT_IIC_SCL=0;
delay_us(2);
AT_IIC_SCL=1;
receive<<=1;
if(AT_IIC_SDA_READ)
{
receive++;
}
delay_us(1);
}
if (!ack)
{
I2cNoAck();
}
else
{
I2cAck();
}
return receive;
}
史海拾趣
|
上面这张令人震惊的照片展示了世界最高建筑哈利法塔遭闪电击中时的场面。 照片的拍摄者是一位23岁名叫穆罕默德·哈姆丹的学生,来自巴基斯坦,目前在阿联酋攻读建筑工程学。当时,迪拜正遭受暴风雨的袭击。雷电中,高达828米的哈利法塔在紫色的 ...… 查看全部问答> |
|
hmc5883的程序有人做过么?我的程序哪里出问题了?本人菜鸟,见笑了。 调了好几个小时了,就是不知道问题在哪里,请高手们指点。 测量先不说,就是怎么读寄存器都没弄清。 看了中文的pdf了,但是还是没搞懂,先看看我的程序吧。 程序部分(已近将无关部分删除): uchar code table[]=\"0123456789\"; //////////// ...… 查看全部问答> |
|
已经用其他程序试验过了,不是xdata的问题,xdata里的数据能正常使用。我在用51做一个32点的fft。 部分代码如下: #include #include #define uchar unsigned char #define uint unsigned int ...… 查看全部问答> |
|
我在网上买了一块PS2的数字小键盘,就是传统台式机键盘最右边的数字键部分。 学习了一下PS2及扫描编码相关内容,看懂了程序,但是,由于小键盘只有部分按键,有的键还是不能读取。 0—9数字键是可以输入的,小键盘的enter也能读取,但+、-、*、/ ...… 查看全部问答> |




