[mw_shl_code=c,true]
这是IIC的实现
#include "IIC.h"
#include "delay.h"
#include "USART.h"
#include "stdio.h"
/**************************????????********************************************
*???????: void IIC_Init(void)
*????????: ??????I2C????????????????
*******************************************************************************/
void IIC_Init(void)
{
/*
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
// ?????? I2C1 ???????±??
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE );
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_I2C1);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_I2C1);
// PB8-I2C1_SCL??PB9-I2C1_SDA
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// I2C ????
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C ;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 50000;
// I2C1 ??????
I2C_Init(I2C1, &I2C_InitStructure);
// ???? I2C1
I2C_Cmd(I2C1,ENABLE);
//???í????????
I2C_AcknowledgeConfig(I2C1, ENABLE);
printf("IIC ×??????????ê??....\r\n");
*/
// ?í??????IIC
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE );
// PB8-SCL PB9-SDA
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//??????????GPIOB
GPIO_Init(GPIOB, &GPIO_InitStructure);
printf("IIC×??????????ê??...\r\n");
}
/**************************????????********************************************
*???????: void IIC_Start(void)
*????????: ?ú?úIIC????????
*******************************************************************************/
void IIC_Start(void)
{
SDA_OUT(); //sda??????
IIC_SDA_H;
IIC_SCL_H;
delay_us(4);
IIC_SDA_L; //START:when CLK is high,DATA change form high to low
delay_us(4);
IIC_SCL_L; //??×?I2C×?????×?±?·????ò????????
}
/**************************????????********************************************
*???????: void IIC_Stop(void)
*????????: //?ú?úIIC????????
*******************************************************************************/
void IIC_Stop(void)
{
SDA_OUT();//sda??????
IIC_SCL_L;
IIC_SDA_L;//STOP:when CLK is high DATA change form low to high
delay_us(4);
IIC_SCL_H;
IIC_SDA_H;//·???I2C×????á??????
delay_us(4);
}
/**************************????????********************************************
*???????: u8 IIC_Wait_Ack(void)
*????????: ????????????????
//·???????1???????????§°?
// 0??????????????
*******************************************************************************/
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN(); //SDA?è????????
IIC_SDA_H;delay_us(1);
IIC_SCL_H;delay_us(1);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>50)
{
IIC_Stop();
return 1;
}
delay_us(1);
}
IIC_SCL_L;//?±??????0
return 0;
}
/**************************????????********************************************
*???????: void IIC_Ack(void)
*????????: ?ú?úACK????
*******************************************************************************/
void IIC_Ack(void)
{
IIC_SCL_L;
SDA_OUT();
IIC_SDA_L;
delay_us(2);
IIC_SCL_H;
delay_us(2);
IIC_SCL_L;
}
/**************************????????********************************************
*???????: void IIC_NAck(void)
*????????: ?ú?úNACK????
*******************************************************************************/
void IIC_NAck(void)
{
IIC_SCL_L;
SDA_OUT();
IIC_SDA_H;
delay_us(2);
IIC_SCL_L;
delay_us(2);
IIC_SCL_L;
}
/**************************????????********************************************
*???????: void IIC_Send_Byte(u8 txd)
*????????: IIC·???????×???
*******************************************************************************/
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
IIC_SCL_L;//????±??????????????
for(t=0;t<8;t++)
{
if((txd&0x80)>>7 == 1) // IIC_SDA=(txd&0x80)>>7;
IIC_SDA_H;
else
IIC_SDA_L;
txd<<=1;
delay_us(2);
IIC_SCL_H;
delay_us(2);
IIC_SCL_L;
delay_us(2);
}
}
/**************************????????********************************************
*???????: u8 IIC_Read_Byte(unsigned char ack)
*????????: //??1??×?????ack=1?±??·???ACK??ack=0??·???nACK
*******************************************************************************/
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();//SDA?è????????
for(i=0;i<8;i++ )
{
IIC_SCL_L;
delay_us(2);
IIC_SCL_H;
receive<<=1;
if(READ_SDA)
receive++;
delay_us(2);
}
if (ack)
IIC_Ack(); //·???ACK
else
IIC_NAck();//·???nACK
return receive;
}
/**************************????????********************************************
*???????: unsigned char I2C_ReadOneByte(unsigned char I2C_Addr,unsigned char addr)
*????????: ???????¨?è±? ???¨?????÷????????
???? I2C_Addr ??±ê?è±????·
addr ?????÷???·
·??? ??????????
*******************************************************************************/
unsigned char I2C_ReadOneByte(unsigned char I2C_Addr,unsigned char addr)
{
unsigned char res=0;
IIC_Start();
IIC_Send_Byte(I2C_Addr); //·??????ü??
res++;
IIC_Wait_Ack();
IIC_Send_Byte(addr); res++; //·??????·
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(I2C_Addr+1); res++; //????????????
IIC_Wait_Ack();
res=IIC_Read_Byte(0);
IIC_Stop();//?ú?ú????????????
return res;
}
/**************************????????********************************************
*???????: u8 IICreadBytes(u8 dev, u8 reg, u8 length, u8 *data)
*????????: ???????¨?è±? ???¨?????÷?? length????
???? dev ??±ê?è±????·
reg ?????÷???·
length ??????×?????
*data ????????????????·???????
·??? ????????×???????
*******************************************************************************/
u8 IICreadBytes(u8 dev, u8 reg, u8 length, u8 *data){
u8 count = 0;
u8 temp;
IIC_Start();
IIC_Send_Byte(dev); //·??????ü??
IIC_Wait_Ack();
IIC_Send_Byte(reg); //·??????·
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(dev+1); //????????????
IIC_Wait_Ack();
for(count=0;count<length;count++){
if(count!=(length-1))
temp = IIC_Read_Byte(1); //??ACK????????
else
temp = IIC_Read_Byte(0); //×??ó????×???NACK
data[count] = temp;
}
IIC_Stop();//?ú?ú????????????
return count;
}
/**************************????????********************************************
*???????: u8 IICwriteBytes(u8 dev, u8 reg, u8 length, u8* data)
*????????: ???à??×??????????¨?è±? ???¨?????÷
???? dev ??±ê?è±????·
reg ?????÷???·
length ??????×?????
*data ???????????????×???·
·??? ·?????·?????
*******************************************************************************/
u8 IICwriteBytes(u8 dev, u8 reg, u8 length, u8* data){
u8 count = 0;
IIC_Start();
IIC_Send_Byte(dev); //·??????ü??
IIC_Wait_Ack();
IIC_Send_Byte(reg); //·??????·
IIC_Wait_Ack();
for(count=0;count<length;count++)
{
IIC_Send_Byte(data[count]);
IIC_Wait_Ack();
}
IIC_Stop();//?ú?ú????????????
return 1; //status == 0;
}
/**************************????????********************************************
*???????: u8 IICreadByte(u8 dev, u8 reg, u8 *data)
*????????: ???????¨?è±? ???¨?????÷????????
???? dev ??±ê?è±????·
reg ?????÷???·
*data ????????????????·??????·
·??? 1
*******************************************************************************/
u8 IICreadByte(u8 dev, u8 reg, u8 *data){
*data=I2C_ReadOneByte(dev, reg);
return 1;
}
/**************************????????********************************************
*???????: unsigned char IICwriteByte(unsigned char dev, unsigned char reg, unsigned char data)
*????????: ???????¨?è±? ???¨?????÷????×???
???? dev ??±ê?è±????·
reg ?????÷???·
data ??????????×???
·??? 1
*******************************************************************************/
unsigned char IICwriteByte(unsigned char dev, unsigned char reg, unsigned char data){
return IICwriteBytes(dev, reg, 1, &data);
}
/**************************????????********************************************
*???????: u8 IICwriteBits(u8 dev,u8 reg,u8 bitStart,u8 length,u8 data)
*????????: ?? ???? ?? ???¨?è±? ???¨?????÷????×??? ?????à????
???? dev ??±ê?è±????·
reg ?????÷???·
bitStart ??±ê×???????????
length ???¤??
data ??·???±???±ê×?????????
·??? ???? ??1
?§°???0
*******************************************************************************/
u8 IICwriteBits(u8 dev,u8 reg,u8 bitStart,u8 length,u8 data)
{
u8 b;
if (IICreadByte(dev, reg, &b) != 0) {
u8 mask = (0xFF << (bitStart + 1)) | 0xFF >> ((8 - bitStart) + length - 1);
data <<= (8 - length);
data >>= (7 - bitStart);
b &= mask;
b |= data;
return IICwriteByte(dev, reg, b);
}
else {
return 0;
}
}
/**************************????????********************************************
*???????: u8 IICwriteBit(u8 dev, u8 reg, u8 bitNum, u8 data)
*????????: ?? ???? ?? ???¨?è±? ???¨?????÷????×??? ????1????
???? dev ??±ê?è±????·
reg ?????÷???·
bitNum ????????±ê×?????bitNum??
data ??0 ?±????±ê????±???0 ·??ò??±?????
·??? ???? ??1
?§°???0
*******************************************************************************/
u8 IICwriteBit(u8 dev, u8 reg, u8 bitNum, u8 data){
u8 b;
IICreadByte(dev, reg, &b);
b = (data != 0) ? (b | (1 << bitNum)) : (b & ~(1 << bitNum));
return IICwriteByte(dev, reg, b);
}
//------------------End of File----------------------------
[/mw_shl_code]
[mw_shl_code=c,true]
/*
** ????????
*/
#define SDA_IN() {GPIOB->MODER&=0X0FFFFFFF;GPIOB->MODER|=0x80000000;}
/*
** ????????
*/
#define SDA_OUT() {GPIOB->MODER&=0X0FFFFFFF;GPIOB->MODER|=0x30000000;}
/*
** SCL - PB8
*/
#define IIC_SCL_H GPIO_SetBits(GPIOB, GPIO_Pin_8)
#define IIC_SCL_L GPIO_ResetBits(GPIOB, GPIO_Pin_8)
/*
** SDA - PB9
*/
#define IIC_SDA_H GPIO_SetBits(GPIOB, GPIO_Pin_9)
#define IIC_SDA_L GPIO_ResetBits(GPIOB, GPIO_Pin_9)
#define READ_SDA GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)[/mw_shl_code]
keil粘贴代码注释就乱了,请前辈们指点错在哪? 谢谢!
|