资源简介
在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实时折线图
- 下一篇:天理计算机真题答案
相关资源
- cy7c68013a FPGA 程序
- 通过FPGA实现I2C总线的控制的Verilog代码
- 基于STM32F030的PCM5242 miniDSP驱动配置
- MSP430F5529 I2C样例程序
- 51控制I2C高频头
- I2C驱动AT24C16
- OLED 091 12832 I2C STM32 驱动
- CC2530 I2C 驱动
- LPC1768的I2C通信代码
- i2c_ioctl详解
- HTC16C21 驱动
- STM8S 模拟I2C程序 源码
- CAT9555 I/O口扩展芯片Demo应用范例
- 基于fpga实现I2C协议的verilog模块以及测
- AHB总线下的slave ram的verilog代码.rar
- I2C通用程序可用,整理
- PMBus1.2 Spec
- STM32读写时钟PCF8563
- linux I2C工具i2c-tools-3.0.2.tar.bz2
- I2C代码 Verilog
- SM9541压力传感器编程指南
- 利用 EZ-USB® FX3 从器件 FIFO 接口进行设
- LM3S驱动库例程_I2C例程:数字温度传感
- CY7C68013a的slave fifo固件例程 源码
- STM32F4 I2C/IIC 驱动程序
- ModbusTCP_Slave程序
- I2C_Software_Htu21d
- PIC通信源码+部分案例程序
- IIC通讯,实现多组端口使用
- 电子-STM32硬件I2CMaster接口函数V1.01.z
评论
共有 条评论