资源简介
在stm32单片机上,用IO口的上升沿和下降沿中断设计的I2C从机代码。测试通过。所有过程用状态机来控制,没有cpu空延时。
核心代码和单片机相关代码分开,方便移植。
主要用在项目验证和学习交流!

代码片段和文件信息
/*
i2c_slave.c
QQ: 957165610
Ver 1.0
2014-05-11 by xulifeng
Ver 1.1
2014-05-11 by xulifeng
Ver 1.2
2014-05-13 by xulifeng
*/
#include “i2c_slave.h“
typedef enum
{
I2C_SLAVE_IDLE
I2C_SLAVE_ADD//write iic add
I2C_SLAVE_REG//write the register add
I2C_SLAVE_WRITE//master write and slave read
I2C_SLAVE_READ//master read and slave write
I2C_SLAVE_BUSY
}e_I2C_SLAVE_MODE;
e_I2C_SLAVE_MODE i2c_slave_mode = I2C_SLAVE_IDLE;
unsigned char I2C_DATA_TEMP = 0;
unsigned char i2c_slave_reg_p = 0;//the register add
unsigned char i2c_slave_data_p = 0;//
void i2c_slave_scl_h( void )
{
I2C_SDA_INT_EN();
switch( i2c_slave_mode )
{
case I2C_SLAVE_ADD:
case I2C_SLAVE_REG:
case I2C_SLAVE_WRITE:
I2C_DATA_TEMP <<= 1;
if( I2C_SDA_IN() )
I2C_DATA_TEMP ++;
i2c_slave_data_p++;
break;
case I2C_SLAVE_READ:
i2c_slave_data_p++;
if( i2c_slave_data_p > 8 )
{
if( I2C_SDA_IN() )
{
i2c_slave_mode = I2C_SLAVE_BUSY;
}
}
default:break;
}
}
void i2c_slave_scl_l( void )
{
I2C_SDA_INT_DIS();
I2C_SCL_L();//slow the i2c speed
if( i2c_slave_data_p > 8 )
{
i2c_slave_data_p = 0;
if( i2c_slave_mode == I2C_SLAVE_READ )
{
I2C_SLAVE_READ_BYTE(i2c_slave_reg_p++ &I2C_DATA_TEMP);
if( I2C_DATA_TEMP & 0x80 )//output a bit
I2C_SDA_H();
else
I2C_SDA_L();
I2C_DATA_TEMP <<= 1;
}
else
I2C_SDA_H();//end ack;
I2C_SCL_H();
return;
}
switch( i2c_slave_mode )
{
case I2C_SLAVE_ADD:
if( i2c_slave_data_p == 8 )
{
if( I2C_DATA_TEMP >> 1 == I2C_ADD )
{
I2C_SDA_L();//ack
if( I2C_DATA_TEMP & 0x01 )//read
{
i2c_slave_mode = I2C_SLAVE_READ;
}
else
{
i2c_slave_mode = I2C_SLAVE_REG;//write regster add
}
}
else
i2c_slave_mode = I2C_SLAVE_BUSY;//nack
}
break;
case I2C_SLAVE_REG:
if( i2c_slave_data_p == 8 )
{
I2C_SDA_L();//ack
i2c_slave_reg_p = I2C_DATA_TEMP;
i2c_slave_mode = I2C_SLAVE_WRITE;
}
break;
case I2C_SLAVE_WRITE:
if( i2c_slave_data_p == 8 )
{//
if( I2C_SLAVE_WRITE_BYTE( i2c_slave_reg_p++ I2C_DATA_TEMP ) )
{
I2C_SDA_L();
}
else
{
i2c_slave_mode = I2C_SLAVE_BUSY;
}
}
break;
case I2C_SLAVE_READ:
if( i2c_slave_data_p < 8 )
{
if( I2C_DATA_TEMP & 0x80 )//output a bit
I2C_SDA_H();
else
I2C_SDA_L();
I2C_DATA_TEMP <<= 1;
}
if( i2c_slave_data_p == 8 )
{
I2C_SDA_H();
}
default:break;
}
I2C_SCL_H();
}
void i2c_slave_sda_h( void )
{
if( I2C_SCL_IN() )
{
I2C_SCL_INT_DIS();
i2c_slave_mode = I2C_SLAVE_IDLE;
}
}
void i2c_slave_sda_l( void )
{
if( I2C_SCL_IN() )
{
I2C_SCL_INT_EN();
i2c_slave_mode = I2C_SLAVE_ADD;
i2c_slave_data_p = 0;
}
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 2980 2014-05-13 13:13 i2c_slave\i2c_slave.c
文件 961 2014-05-12 23:16 i2c_slave\i2c_slave.h
文件 4610 2014-05-13 13:12 i2c_slave\i2c_slave_port.c
文件 378 2014-05-11 15:27 i2c_slave\i2c_slave_port.h
目录 0 2014-05-11 16:21 i2c_slave
----------- --------- ---------- ----- ----
8929 5
- 上一篇:JFreeChart实时折线图
- 下一篇:天理计算机真题答案
相关资源
- I2C读写AT24C02 基于STM32F103 cube116540
- 用DIO 做的I2C程式
- I2C总线接口设计
- 8051F040SMBUS多机通信
- FreeModbus_Slave+STM32F407+USART2代码亲测可
- DHT10_I2C驱动.zip
- I2C串行EEPROM应用系统的健壮性设计
- 电子-GravityI2C3.7V锂电池电量计stm32L1
- arduino主机,stm8从机。I2C测试 。每次
- ifenslave_2.9_all.deb
- 10位ADC转换器AD5612(stm32_IO口模拟I2C)
- USB2.0芯片cy68013高速bulk传输slave fifo模
- (带有源代码)基于FPGA的模拟I2C接口
- I2C-verilog-(非常详细的i2c学习心得)
- stm32f103iic读取AT24XX全系eeprom
- 分享一个0.96的oled显示驱动,软件模拟
- Profibus master+slave+VSPD 测试软件
- ModbusTools_破解版
- DAC8571_I2C模式_STM32
- STM32F4 I2C从机中断
- ADS1110stm32驱动自带I2C驱动
- STM32F103C8 例程
- stm32 I2C主从机模式控制代码
- modbus_poll和modbus_slave_64bit.rar
- 基于STM32F103硬件I2C读写24Cxx驱动代码的
- MbPoll_v7.1.0 MbSlave_v6.2.0
- Ginkgo_USB-I2C_Classic_Setup_v2.9.2.zip
- Modbus Slave破解版
- FPGA+USB68013+SLAVEFIFO+SDRAM+FIFO
- I2C从设备接收数据verilog代码实现
评论
共有 条评论