标题:
STM32模拟I2C总线程序
[打印本页]
作者:
xifei
时间:
2018-4-6 14:34
标题:
STM32模拟I2C总线程序
STM32模拟I2C总线程序,测试可用
单片机源程序如下:
#include <includes.h>
#include "myiic.h"
#include "delay.h"
#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
OS_SEM IIC_SemLock;
//初始化IIC
void IIC_Init(void)
{
OS_ERR err = OS_ERR_NONE;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD ; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB6,PB7 输出高
OSSemCreate(&IIC_SemLock,"",1,&err);
}
void IIC_Lock(void)
{
OS_ERR err = OS_ERR_NONE;
OSSemPend(&IIC_SemLock,0,OS_OPT_PEND_BLOCKING,NULL,&err);
}
void IIC_UnLock(void)
{
OS_ERR err = OS_ERR_NONE;
OSSemPost(&IIC_SemLock,OS_OPT_POST_ALL,&err);
}
u8 IIC_Start(void)
{
SDA_H;
SCL_H;
delay_us(5);
if(!SDA_read)return 0;
SDA_L;
delay_us(5);
if(SDA_read)return 0;
SDA_L;
delay_us(5);
return 1;
}
void IIC_Stop(void)
{
SCL_L;
delay_us(5);
SDA_L;
delay_us(5);
SCL_H;
delay_us(5);
SDA_H;
delay_us(5);
}
void IIC_Ack(void)
{
SCL_L;
delay_us(5);
SDA_L;
delay_us(5);
SCL_H;
delay_us(5);
SCL_L;
delay_us(5);
}
void IIC_NoAck(void)
{
SCL_L;
delay_us(5);
SDA_H;
delay_us(5);
SCL_H;
delay_us(5);
SCL_L;
delay_us(5);
}
u8 IIC_WaitAck(void)
{
SCL_L;
delay_us(5);
SDA_H;
delay_us(5);
SCL_H;
delay_us(5);
if(SDA_read)
{
SCL_L;
return 0;
}
SCL_L;
return 1;
}
void IIC_SendByte(u8 SendByte)
{
u8 i=8;
while(i--)
{
SCL_L;
delay_us(5);
if(SendByte&0x80)
SDA_H;
else
SDA_L;
SendByte<<=1;
delay_us(5);
SCL_H;
delay_us(5);
}
SCL_L;
}
u8 IIC_ReceiveByte(void)
{
u8 i=8;
u8 ReceiveByte=0;
SDA_H;
while(i--)
{
ReceiveByte<<=1;
SCL_L;
delay_us(5);
SCL_H;
delay_us(5);
if(SDA_read)
{
ReceiveByte|=0x01;
}
}
SCL_L;
return ReceiveByte;
}
u8 IIC_BufferRead(u8* pBuffer,u16 length,u8 DeviceAddress)
{
if(!IIC_Start())return 0;
IIC_SendByte(DeviceAddress|0x01);
if(!IIC_WaitAck())
{
IIC_Stop();
return 0;
}
while(length)
{
*pBuffer++=IIC_ReceiveByte();
length--;
if(length>0)IIC_Ack();
else IIC_NoAck();
}
IIC_Stop();
delay_ms(1);
return 1;
}
u8 IIC_BufferWrite(u8* pBuffer, u16 length, u8 DeviceAddress)
{
if(!IIC_Start())return 0;
IIC_SendByte(DeviceAddress);
if(!IIC_WaitAck())
{
IIC_Stop();
return 0;
}
while(length)
{
IIC_SendByte(* pBuffer);
IIC_WaitAck();
length--;
pBuffer++;
}
IIC_Stop();
delay_ms(5);
return 1;
}
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
IIC.rar
(1.86 KB, 下载次数: 36)
2018-4-6 14:34 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1