初级会员

- 积分
- 61
- 金钱
- 61
- 注册时间
- 2018-7-9
- 在线时间
- 15 小时
|

楼主 |
发表于 2022-1-18 17:22:53
|
显示全部楼层
已经解决,把I2C的时序调整下就可以。#include "myiic.h"
#include "delay.h"
#include "stm32f10x.h"
#include "stdbool.h"
char test=0;
//3õê¼»ˉIIC
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //íÆíìêä3ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //¿a©êä3ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
SDA_H;
SCL_L;
}
/*******************************************************************************
* Function Name : I2C_delay
* Description : Simulation IIC Timing series delay
* Input : None
* Output : None
* Return : None
****************************************************************************** */
void I2C_delay(void)
{
u8 i=5; //Õaàï¿éòÔóÅ»ˉËù¶è £¬¾-2aêÔ×îμíμ½5»1ÄüD′èë
while(i)
{
i--;
}
}
void delay5us(void)
{
int i=5;
while(i)
{
i--;
}
}
/*******************************************************************************
* Function Name : I2C_Start
* Description : Master Start Simulation IIC Communication
* Input : None
* Output : None
* Return : Wheather Start
****************************************************************************** */
//static void iicDevStart(void)
bool iicDevStart(void)
{
// SDA_OUT(); //sdaÏßêä3ö
// 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;//ÇˉסI2C×üÏߣ¬×¼±¸·¢Ëí»ò½óêÕêy¾Y
SDA_H;
SCL_H;
delay_us(4);//I2C_delay();
if(!SDA_read)return false; //SDAÏßÎaμíμçÆ½Ôò×üÏßÃ|,íË3ö
SDA_L;
delay_us(4);//I2C_delay();
if(SDA_read) return false; //SDAÏßÎa¸ßμçÆ½Ôò×üÏß3ö′í,íË3ö
SDA_L;
delay_us(4);//I2C_delay();
return true;
}
//2úéúIIC1í£Ö1DÅoÅ
static void iicDevStop(void)
{
// SDA_OUT();//sdaÏßêä3ö
// 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;//·¢ËíI2C×üÏß½áêøDÅoÅ
// delay_us(4);
SCL_L;
// I2C_delay();
SDA_L;
delay_us(4);//I2C_delay();
SCL_H;
// I2C_delay();
SDA_H;
delay_us(4);//I2C_delay();
}
/*******************************************************************************
* Function Name : I2C_WaitAck
* Description : Master Reserive Slave Acknowledge Single
* Input : None
* Output : None
* Return : Wheather Reserive Slave Acknowledge Single
****************************************************************************** *///μè′yó|′eDÅoÅμ½à′
//·μ»ØÖμ£o1£¬½óêÕó|′eê§°ü
// 0£¬½óêÕó|′e3é1|
static u8 iicDevWaitAck(void)
{
// u8 ucErrTime=0;
// SDA_IN(); //SDAéèÖÃÎaêäèë
// IIC_SDA=1;delay_us(1);
// IIC_SCL=1;delay_us(1);
// while(READ_SDA)
// {
// ucErrTime++;
// if(ucErrTime>250)
// {
// iicDevStop();
// return 1;
// }
// }
// IIC_SCL=0;//ê±Öóêä3ö0
// return 0;
SCL_L;
// I2C_delay();
SDA_H;
delay_us(1);//I2C_delay();
SCL_H;
delay_us(1);//I2C_delay();
if(SDA_read)
{
SCL_L;
// I2C_delay();
return false;
}
SCL_L;
// I2C_delay();
return true;
}
/*******************************************************************************
* Function Name : I2C_Ack
* Description : Master Send Acknowledge Single
* Input : None
* Output : None
* Return : None
****************************************************************************** */
//2úéúACKó|′e
static void iicDevAck(void)
{
// IIC_SCL=0;
// SDA_OUT();
// IIC_SDA=0;
// delay_us(1);
// IIC_SCL=1;
// delay_us(1);
// IIC_SCL=0;
SCL_L;
// I2C_delay();
SDA_L;
delay_us(1);//I2C_delay();
SCL_H;
delay_us(1);//I2C_delay();
SCL_L;
// I2C_delay();
}
/*******************************************************************************
* Function Name : I2C_NoAck
* Description : Master Send No Acknowledge Single
* Input : None
* Output : None
* Return : None
****************************************************************************** */
//2»2úéúACKó|′e
static void iicDevNAck(void)
{
// IIC_SCL=0;
// SDA_OUT();
// IIC_SDA=1;
// delay_us(1);
// IIC_SCL=1;
// delay_us(1);
// IIC_SCL=0;
SCL_L;
// I2C_delay();
SDA_H;
delay_us(1);//I2C_delay();
SCL_H;
delay_us(1);//I2C_delay();
SCL_L;
// I2C_delay();
}
/*******************************************************************************
* Function Name : I2C_SendByte
* Description : Master Send a Byte to Slave
* Input : Will Send Date
* Output : None
* Return : None
****************************************************************************** */
//IIC1·¢Ëíò»¸ö×Ö½ú
//·μ»Ø′ó»úóDÎTó|′e
//1£¬óDó|′e
//0£¬ÎTó|′e
static void iicDevSendByte(u8 txd)
{
// u8 t;
// SDA_OUT();
// IIC_SCL=0;//à-μíê±Öó¿aê¼êy¾Y′«êä
// for(t=0;t<8;t++)
// {
// IIC_SDA=(txd&0x80)>>7;
// txd<<=1;
// delay_us(1);
// IIC_SCL=1;
// delay_us(1);
// IIC_SCL=0;
// delay_us(1);
// }
u8 i=8;
while(i--)
{
SCL_L;
delay_us(1);//I2C_delay();
if(txd&0x80)
SDA_H;
else
SDA_L;
txd<<=1;
delay_us(1);//I2C_delay();
SCL_H;
delay_us(1);//I2C_delay();
}
SCL_L;
delay_us(1);
}
//¶á1¸ö×Ö½ú£¬ack=1ê±£¬·¢ËíACK£¬ack=0£¬·¢ËínACK
static u8 iicDevReceiveByte(u8 ack)
{
u8 i,receive=0;
SDA_H;// SDA_IN();//SDAéèÖÃÎaêäèë
for(i=0;i<8;i++ )
{
SCL_L;//IIC_SCL=0;
delay_us(1);
SCL_H;//IIC_SCL=1;
receive<<=1;
if(SDA_read)receive++;
delay_us(1);
}
if (!ack)
iicDevNAck();//·¢ËínACK
else
iicDevAck(); //·¢ËíACK
return receive;
}
//′óÖ¸¶¨μØÖ·¶á3öò»¸öêy¾Y
//ReadAddr:¿aê¼¶áêyμÄμØÖ·
//·μ»ØÖμ :¶áμ½μÄêy¾Y
u8 iicDevReadByte(u8 devaddr,u8 addr)
{
u8 temp=0;
iicDevStart();
iicDevSendByte(devaddr);//·¢ËíÆ÷¼tD′Ãüáî
iicDevWaitAck();
iicDevSendByte(addr); //·¢ËíμíμØÖ·
iicDevWaitAck();
iicDevStart();
iicDevSendByte(devaddr|1);//·¢ËíÆ÷¼t¶áÃüáî
iicDevWaitAck();
temp=iicDevReceiveByte(0);
iicDevStop();//2úéúò»¸öí£Ö1ìõ¼t
return temp;
}
//á¬Dø¶á¶à¸ö×Ö½ú
//addr:Æeê¼μØÖ·
//rbuf:¶áêy¾Y»o′æ
//len:êy¾Y3¤¶è
void iicDevRead(u8 devaddr,u8 addr,u8 len,u8 *rbuf)
{
int i=0;
iicDevStart();
iicDevSendByte(devaddr);
iicDevWaitAck();
iicDevSendByte(addr);//μØÖ·×ÔÔö
iicDevWaitAck();
iicDevStart();
iicDevSendByte(devaddr|1);
iicDevWaitAck();
for(i=0; i<len; i++)
{
if(i==len-1)
{
rbuf[i] = iicDevReceiveByte(0);//×îoóò»¸ö×Ö½ú2»ó|′e
}
else
rbuf[i] = iicDevReceiveByte(1);
}
iicDevStop( );
}
//′óÖ¸¶¨μØÖ·D′èëò»¸öêy¾Y
//WriteAddr ′èëêy¾YμÄÄ¿μÄμØÖ·
//DataToWrite:òaD′èëμÄêy¾Y
void iicDevWriteByte(u8 devaddr,u8 addr,u8 data)
{
iicDevStart();
iicDevSendByte(devaddr); //·¢ËíÆ÷¼tD′Ãüáî
iicDevWaitAck();
iicDevSendByte(addr); //·¢ËíμíμØÖ·
iicDevWaitAck();
iicDevSendByte(data); //·¢Ëí×Ö½ú
iicDevWaitAck();
iicDevStop(); //2úéúò»¸öí£Ö1ìõ¼t
}
//á¬DøD′¶à¸ö×Ö½ú
//addr:Æeê¼μØÖ·
//wbuf ′êy¾Y»o′æ
//len:êy¾YμÄ3¤¶è
void iicDevWrite(u8 devaddr,u8 addr,u8 len,u8 *wbuf)
{
int i=0;
iicDevStart();
iicDevSendByte(devaddr);
iicDevWaitAck();
iicDevSendByte(addr); //μØÖ·×ÔÔö
iicDevWaitAck();
for(i=0; i<len; i++)
{
iicDevSendByte(wbuf[i]);
iicDevWaitAck();
}
iicDevStop();
}
|
|