资源简介
模拟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 从机\
- 上一篇:CityEngine的CGA代码方法详细
- 下一篇:ABC of igraph
相关资源
- Modbus Rtu Slave (codesyssyscom.lib实现
- STM8 SPI从机通讯程序
- IO口模拟I2C从机
- cy7c68013a FPGA 程序
- SSP作SPI从机实验.rar
- STM8S 模拟I2C程序 源码
- AHB总线下的slave ram的verilog代码.rar
- STM32读写时钟PCF8563
- 利用 EZ-USB® FX3 从器件 FIFO 接口进行设
- CY7C68013a的slave fifo固件例程 源码
- 51单片机实现Modbus从机程序
- c8051f320 主机从机 SPI程序
- cc1101实现组网,可带30个从机
- ModbusTCP_Slave程序
- STM32F103+模拟I2C实现
- STM8主从机IIC通讯案例
- 3个从机1个主机485通信代码,支持51
- 单片机或者STM32能直接用的sht读温湿度
- MODBUS从机基于STM32
- 基于STM32实现的模拟I2C
- I2C slaver 从机 Verilog代码实现
- modbus tcp master 和slave 谨慎
- 模拟I2C读写24C256和24C02
- iic_slaver.rar
- 在FPGA上使用verilog实现SPI通信协议
- PIC单片机主机和从机SPI通信
- ModbusSlave.zip
- 树莓派SPI从机主机代码
- STM32F103+VL53L0源代码.zip
- 飞思卡尔 LIN 从机 程序源码
评论
共有 条评论