金牌会员
 
- 积分
- 2097
- 金钱
- 2097
- 注册时间
- 2014-3-7
- 在线时间
- 491 小时
|
发表于 2018-9-25 15:42:20
|
显示全部楼层
[mw_shl_code=c,true]/**
******************************************************************************
* @file IIC.c
* @brief simulation function
* @CPU STM32F10x
* @compiler Keil uVision V4.74
* @Author Alex.fang(china shenzhen)
* @Copyright GPL
* @version V1.0.0
* @date 02-Sept-2015
******************************************************************************
* @attention
*/
#include "IIC.h"
#include "delay.h"
GPIO_InitTypeDef GPIO_InitStructure;
/**
* @brief IIC Init
* @param A:
* @retval None
*/
void IIC_Init(void)
{
RCC_APB2PeriphClockCmd(IIC_RCC_APB2Periph_GPIOx|RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin = IIC_SDA_GPIO_Pin | IIC_SCL_GPIO_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(IIC_GPIOx, &GPIO_InitStructure);
GPIO_SetBits(IIC_GPIOx,IIC_SDA_GPIO_Pin | IIC_SCL_GPIO_Pin); //PB10,PB11 输出高
}
/**
* @brief Set SDA Pin as Output Mode
* @retval None
*/
void SDA_OUT(void)
{
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = IIC_SDA_GPIO_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(IIC_GPIOx, &GPIO_InitStructure);
}
/**
* @brief Set SDA Pin as Input Mode
* @retval None
*/
void SDA_IN(void)
{
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = IIC_SDA_GPIO_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(IIC_GPIOx, &GPIO_InitStructure);
}
/**
* @brief read input voltage from SDA pin
* @retval None
*/
unsigned char SDA_READ(void)
{
return GPIO_ReadInputDataBit(IIC_GPIOx, IIC_SDA_GPIO_Pin);
}
/**
* @brief output high form SDA pin
* @retval None
*/
void IIC_SDA_1(void)
{
GPIO_SetBits(IIC_GPIOx, IIC_SDA_GPIO_Pin);
}
/**
* @brief output low form SDA pin
* @retval None
*/
void IIC_SDA_0(void)
{
GPIO_ResetBits(IIC_GPIOx, IIC_SDA_GPIO_Pin);
}
/**
* @brief output high form SCL pin
* @retval None
*/
void IIC_SCL_1(void)
{
GPIO_SetBits(IIC_GPIOx, IIC_SCL_GPIO_Pin);
}
/**
* @brief output LOW form SCL pin
* @retval None
*/
void IIC_SCL_0(void)
{
GPIO_ResetBits(IIC_GPIOx, IIC_SCL_GPIO_Pin);
}
/**
* @brief Simulate IIC conmunication :Create Start signal
* @retval None
*/
void IIC_Start(void)
{
SDA_OUT(); //sda output
IIC_SDA_1();
IIC_SCL_1();
delay_us(4);
IIC_SDA_0(); //START:when CLK is high,DATA change form high to low
delay_us(4);
IIC_SCL_0(); //hold scl line, prepare to transmit data
}
/**
* @brief Simulate IIC conmunication : Create Stop signal
* @retval None
*/
void IIC_Stop(void)
{
SDA_OUT(); //sda output mode
IIC_SCL_0();
IIC_SDA_0(); //STOP:when CLK is high DATA change form low to high
delay_us(4);
IIC_SCL_1();
IIC_SDA_1(); //indicate transmit over
delay_us(4);
}
/**
* @brief Simulate IIC conmunication : wait for target device's ACK
* @retval ACK (0) : receive success
* @retval NACK(1) : receive unsuccess
*/
unsigned char IIC_Wait_Ack(void)
{
unsigned char ucErrTime = 0;
SDA_IN(); //set as input mode
IIC_SDA_1();
delay_us(1);
IIC_SCL_1();
delay_us(1);
while(SDA_READ())
{
ucErrTime++;
if(ucErrTime > 250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL_0(); //release scl line
return 0;
}
/**
* @brief Simulate IIC conmunication : make an ACK
* @retval None
*/
void IIC_Ack(void)
{
IIC_SCL_0();
SDA_OUT();
IIC_SDA_0();
delay_us(2);
IIC_SCL_1();
delay_us(2);
IIC_SCL_0();
}
/**
* @brief Simulate IIC conmunication : don't make an ACK
* @retval None
*/
void IIC_NAck(void)
{
IIC_SCL_0();
SDA_OUT();
IIC_SDA_1();
delay_us(2);
IIC_SCL_1();
delay_us(2);
IIC_SCL_0();
}
/**
* @brief Simulate IIC conmunication : Transmit one byte Data
* @param txd: data to be transmit
* @retval None
*/
void IIC_Send_Byte(unsigned char txd)
{
unsigned char i;
SDA_OUT();
IIC_SCL_0();//push down scl to start transmit data
for(i = 0; i < 8; ++i)
{
if(txd & 0x80)
{
IIC_SDA_1();
}
else
{
IIC_SDA_0();
}
txd <<= 1;
delay_us(2);
IIC_SCL_1();
delay_us(2);
IIC_SCL_0();
delay_us(2);
}
}
/**
* @brief Simulate IIC conmunication : Receive one byte Data
* @param ack: Whether transmit ACK
* @retval the data have been receive
* ack=1 send ACK
* ack=0 send nACK
*/
unsigned char IIC_Read_Byte(unsigned char ack)
{
unsigned char i, res = 0;
SDA_IN(); //SDA input mode
for(i = 0; i < 8; ++i ){
IIC_SCL_0();
delay_us(2);
IIC_SCL_1();
res <<= 1;
if(SDA_READ()){
res++;
}
delay_us(1);
}
if (!ack){
IIC_NAck();//make NACK
}
else {
IIC_Ack(); //make ACK
}
return res;
}
[/mw_shl_code]
[mw_shl_code=c,true]/**
******************************************************************************
* @file IIC.c
* @brief simulation function
* @CPU STM32F10x
* @compiler Keil uVision V4.74
* @author Alex.fang(china)
* @copyright GPL
* @version V1.0.0
* @date 02-Sept-2015
******************************************************************************
* @attention
*/
#ifndef __IIC_H__
#define __IIC_H__
#include "stm32f10x.h"
#define IIC_SDA_GPIO_Pin GPIO_Pin_11
#define IIC_SCL_GPIO_Pin GPIO_Pin_10
#define IIC_GPIOx GPIOB
#define IIC_RCC_APB2Periph_GPIOx RCC_APB2Periph_GPIOB
//#define IIC_SDA_GPIO_AF GPIO_AF_1 //no use
//#define IIC_SCL_GPIO_AF GPIO_AF_1 //no use
/**
* @brief IIC Init
* @param A:
* @retval None
*/
void IIC_Init(void);
/**
* @brief Set SDA Pin as Output Mode
* @retval None
*/
void SDA_OUT(void);
/**
* @brief Set SDA Pin as Input Mode
* @retval None
*/
void SDA_IN(void);
/**
* @brief read input voltage from SDA pin
* @retval None
*/
unsigned char SDA_READ(void);
/**
* @brief output high form SDA pin
* @retval None
*/
void IIC_SDA_1(void);
/**
* @brief output low form SDA pin
* @retval None
*/
void IIC_SDA_0(void);
/**
* @brief output high form SCL pin
* @retval None
*/
void IIC_SCL_1(void);
/**
* @brief output LOW form SCL pin
* @retval None
*/
void IIC_SCL_0(void);
/**
* @brief Simulate IIC conmunication :Create Start signal
* @retval None
*/
void IIC_Start(void);
/**
* @brief Simulate IIC conmunication : Create Stop signal
* @retval None
*/
void IIC_Stop(void);
/**
* @brief Simulate IIC conmunication : wait for target device's ACK
* @retval ACK (0) : receive success
* @retval NACK(1) : receive unsuccess
*/
unsigned char IIC_Wait_Ack(void);
/**
* @brief Simulate IIC conmunication : make an ACK
* @retval None
*/
void IIC_Ack(void);
/**
* @brief Simulate IIC conmunication : don't make an ACK
* @retval None
*/
void IIC_NAck(void);
/**
* @brief Simulate IIC conmunication : Transmit one byte Data
* @param txd: data to be transmit
* @retval None
*/
void IIC_Send_Byte(unsigned char txd);
/**
* @brief Simulate IIC conmunication : Receive one byte Data
* @param ack: Whether transmit ACK
* @retval the data have been receive
* ack=1 send ACK
* ack=0 send nACK
*/
unsigned char IIC_Read_Byte(unsigned char ack);
#endif
[/mw_shl_code]
|
|