资源简介
模拟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
相关资源
- STM32F030从机中断接收的iic代码,附带
- FreeModbus_Slave+STM32F407+USART2代码亲测可
- 分布式温控系统
- arduino主机,stm8从机。I2C测试 。每次
- ifenslave_2.9_all.deb
- 10位ADC转换器AD5612(stm32_IO口模拟I2C)
- USB2.0芯片cy68013高速bulk传输slave fifo模
- (带有源代码)基于FPGA的模拟I2C接口
- STM32通过串口实现双机通信,达到数据
- stm32实现modbus主机从机功能通信
- Profibus master+slave+VSPD 测试软件
- ModbusTools_破解版
- STM32F4 I2C从机中断
- STM32 ModBus RTU 从机程序
- stm32 I2C主从机模式控制代码
- modbus_poll和modbus_slave_64bit.rar
- MbPoll_v7.1.0 MbSlave_v6.2.0
- Modbus Slave破解版
- FPGA+USB68013+SLAVEFIFO+SDRAM+FIFO
- 基于HC-05的主从机指纹安防系统主从机
- 代码_老码识途-从机器码到框架的系统
- 基于STM32的SPI双机通讯(含主从机)
- Modbus Poll、Modbus Slave和Virtual Serial Po
- 用stm32硬件I2C和模拟I2C读写EEPROM
- 常用_Modbus-RTU测试工具_主从机都有
- STM32作从机实现简单的Modbus RTU协议
- modbus 主从机软件
- EtherCAT Slave Stack Code Tool
- EtherCATSlaveStackCodeTool.rar
- 基于STM32F103的modbus从机keil实际可用工
评论
共有 条评论