• 大小: 90KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-02
  • 语言: 其他
  • 标签: 模拟I2C  从机  Slave  

资源简介

模拟I2C从机代码 主机代码 以及相对应的波形 时序要求 I2C最高时钟频率需要根据MCU性能调整 主频 指令执行时间 中断响应速度等

资源截图

代码片段和文件信息

#include “myiic.h“
#include “delay.h“
//////////////////////////////////////////////////////////////////////////////////  
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//Mini STM32开发板
//IIC 驱动函数    
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2010/6/10 
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 正点原子 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////    

//初始化IIC
void IIC_Init(void)
{
//RCC->APB1ENR|=1<<22;//先使能外设iic2时钟 
  RCC->APB2ENR|=1<<3;//先使能外设IO PORTB时钟   
GPIOB->CRL&=0XFFFFFF00;//PB0/1 推挽输出
GPIOB->CRL|=0X00000033;    
//GPIOB->ODR|=3;
//GPIOB->ODR&=0xfffffffc;
 
}
//产生IIC起始信号
void IIC_Start(void)
{
IIC_SDA=1;      
IIC_SCL=1;
delay_us(5);
  IIC_SDA=0;//START:when CLK is highDATA change form high to low 
delay_us(5);
IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 
}   
//产生IIC停止信号
void IIC_Stop(void)
{
IIC_SCL=0;
IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
  delay_us(10);//12us
IIC_SCL=1; 
delay_us(20);//21us
IIC_SDA=1;//发送I2C总线结束信号
delay_us(10);    
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)
{
u8 tempbit=0;

IIC_SCL=0;
IIC_SDA=1;
SDA_IN();        //SDA设置为输入  
delay_us(15);//17us
tempbit = READ_SDA;
IIC_SCL=1;
  delay_us(10);//11us
IIC_SCL=0;
delay_us(5);
SDA_OUT();       //SDA设置为输出  
if(tempbit==1)
{
return 0;  //返回noACK
}
else
{
return 1;  //返回ACK
}

//产生ACK应答
void IIC_Ack(void)
{
IIC_SCL=0;
IIC_SDA=0;
delay_us(8);//10us
IIC_SCL=1;
delay_us(8);//10us
IIC_SCL=0;
}
//不产生ACK应答     
void IIC_NAck(void)
{
IIC_SCL=0;
IIC_SDA=1;
delay_us(8);//10us
IIC_SCL=1;
delay_us(8);//10us
IIC_SCL=0;
}        
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答   
void IIC_Send_Byte(u8 txd)
{                        
u8 t;      
for(t=0;t<8;t++)
{   
IIC_SCL=0;
delay_us(5);//6.25us
if(txd&0x80)
IIC_SDA=1;
else
IIC_SDA=0;
//delay_us(1);   
IIC_SCL=1;
delay_us(7);//8us
txd<<=1;    
}
}      
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
u8 IIC_Read_Byte(void)
{
unsigned char ireceive=0;
IIC_SDA=1;//释放SDA,开始接收数据
SDA_IN(); //SDA设置为输入
  for(i=0;i<8;i++)
{
    IIC_SCL=0; 
    delay_us(8);//9us
IIC_SCL=1;
    receive<<=1;
    if(READ_SDA)receive++;   
delay_us(3);//4.5us 
  }
 IIC_SCL=0; 
   SDA_OUT();//SDA设置为输出  
   return receive;
}

void IIC_M_BufWrite(u8 *pBuffer)
{
u8 i;
// IIC_Start();        
// IIC_Send_Byte(0xA0);   
// IIC_Wait_Ack();
// while(NumToWrite--)
// {
// IIC_Send_Byte(*pBuffer);     //    
// IIC_Wait_Ack(); 
// pBuffer++;
// }
// IIC_Stop();//
// delay_ms(1);

IIC_Start();
  IIC_Send_Byte(0xa0);
IIC_Wait_Ack();
for(i=0;i<*pBuffer;i++)
{
IIC_Send_Byte(*(pBuffer+i));
IIC_Wait_Ack();
}
IIC_Stop();
}

void IIC_M_BufRead(u8 *pBuffer)
{
u8 ilen = 0;
// IIC_Start();        
// IIC_Send_Byt

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        3843  2015-02-11 17:32  模拟I2C 从机\I2C Master.c
     文件        4440  2015-03-01 14:06  模拟I2C 从机\I2C Slave.c
     文件     2622554  2015-01-21 10:58  模拟I2C 从机\I2C 时间.bmp
     文件      424482  2015-03-01 14:29  模拟I2C 从机\波形.bmp
     目录           0  2015-03-01 14:01  模拟I2C 从机\

评论

共有 条评论