模拟I2C从机
模拟I2C主机的比较多,但是从机相对主机而言要难很多,这个供大家借鉴。
这个从机程序支持主机对它的随机写和随机读,连续读和连续写没做,有兴趣的可以完善下,呵呵。
//Microcontrol CODE
#include <msp430x22x4.h>
#define SDA BIT1
#define SCL BIT2
#define SEG_A 0xA0 //0x0200---0x027F
#define SEG_B 0xB0 //0x0280---0x02FF
#define SEG_C 0xC0 //0x0300---0x037F
//0x0380---0x0400
__no_init char wokao@0x243;
//=============================
char *send_ptr;
;
;
;
;
;
;
;
//*********************函数声明*************************************
void ACK(void);
//****************************************************************
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
//======================MCLK=16MHz=====================================
DCOCTL = CALDCO_16MHZ;
BCSCTL1 = CALBC1_16MHZ; //MCLK=DCO=16MHz
P3DIR &= ~(SDA+SCL);
)
{
NN=;
PreState = READ_SDA;
while(READ_SCL && NN--)
{
NowState = READ_SDA;
if(PreState && !NowState)
{
START_flag = ;
_DINT();
}
if(!PreState && NowState)
{
STOP_flag = ;
_EINT();
}
PreState = NowState;
if(START_flag)
{
START_flag=;
while(READ_SCL); //START时的SCL高电平状态就等待
;gg>;gg--) //接收器件地址
{
while(!READ_SCL); //SCL低电平状态就等待
DEVICE_ADR<<=;
if(READ_SDA) //数据的第一个CLK高电平来临
DEVICE_ADR |= 0x01;
while(READ_SCL); //SCL高电平状态就等待
}
ACK(); //对设备地址ACK应答信
//-----------以上收到了设备地址,并知晓主机要对从机进行读还是写操作---
;gg>;gg--) //接收内存单元地址
{
while(!READ_SCL);
WORD_ADR<<=;
if(READ_SDA)
WORD_ADR |= 0x01;
while(READ_SCL);
}
//-----------以上就已经接收到内存单元地址------------
ACK(); //对内存单元ACK应答信号
if(DEVICE_ADR & 0x01) //从机发数据给主机 R/W=1
{
if(DEVICE_ADR==SEG_A+0x01)
{
send_ptr =(char*)(0x0200 + WORD_ADR);
}
else if(DEVICE_ADR==SEG_B+0x01)
{
send_ptr =(char*)(0x0280 + WORD_ADR);
}
else if(DEVICE_ADR==SEG_C+0x01)
{
send_ptr =(char*)(0x0300 + WORD_ADR);
}
//--------以上是判断出为主机读从机,要把要读的地址单元赋给指针---
;gg>;gg--)
{
while(!READ_SCL);
if( *send_ptr & 0x80)
_NOP();
else
{
P3DIR |= SDA; //输出0
}
while(READ_SCL); //SCL为1,就保持SDA输出不变
P3DIR &= ~SDA; //SCL为0,就把SDA从新切换到接收状态
*send_ptr <<=;
}
ACK(); //从机数据发送完毕,应答信号
_NOP();
//------------------以上是从机发数据给主机-----------------
}
else //主机写从机 R/W=0
{
;gg>;gg--) //接收主机要写到该器件内存单元的数据
{
while(!READ_SCL);
REC_DATA <<=;
if(READ_SDA)
REC_DATA |= 0x01;
while(READ_SCL);
}
if(DEVICE_ADR==SEG_A)
{
send_ptr =(char*)(0x0200 + WORD_ADR);
*send_ptr = REC_DATA;
}
else if(DEVICE_ADR==SEG_B)
{
send_ptr =(char*)(0x0280 + WORD_ADR);
*send_ptr = REC_DATA;
}
else if(DEVICE_ADR==SEG_C)
{
send_ptr =(char*)(0x0300 + WORD_ADR);
*send_ptr = REC_DATA;
}
ACK();
_NOP();
while(!READ_SCL);
}
}// if(START_flag)
}//while(NN--)
_EINT();
_NOP();
}//while(1)
}
//****************************************************
void ACK(void)
{
// while(READ_SCL);
while(!READ_SCL);
P3DIR |= SDA; //第9个CLK变高的情况下,SDA输出0
while(READ_SCL);
P3DIR &= ~SDA; //第9个CLK变低的情况下,SDA输出1
}
模拟I2C从机的更多相关文章
- 模拟I2C从机程序
;Slave.asm SCL BIT P1. SDA BIT P1. ;---------------------------- ORG RESET: SETB SCL SETB SDA CALL I ...
- S5PV210之GPIO模拟I2c时序之pcf8591与at24xx linux3.0.8驱动
目录:一. 说明 二. 驱动程序说明及问题 三. 案例一 四. 案例二 一. 说明 mini210开发板上带了at24c08, 看了linux内核自带的at24.c的驱动程序,编译下载到看 ...
- 关于模拟I2C的一些问题???
1.在调试BH1750时发现stm32f103rb单片机用模拟I2C通讯时引脚使用开漏模式能正常读出来数据,使用推挽模式则完全无法通讯,发送地址后从机没有应答? https://blog.csdn.n ...
- STM32F10x_模拟I2C读写EEPROM
Ⅰ.写在前面 说到IIC,大家都应该不会陌生,我们初学单片机的时候或多或少都知道或了解过,甚至使用I2C控制过器件.但是,有多少人真正去深入理解,或者深入研究过I2C通信协议呢? 1.我们有必要学习I ...
- MSP430的IO口模拟I2C总线对AT24C25进行读写程序
功能: 实现MSP430口线模拟I2C总线协议与24C04通信. ** 描述: 主系统工作时钟为12MHz,I2C工 ...
- STM8S 模拟I2C程序
STM8S的硬件I2C还是存在问题,不敢贸然使用. 于是决定用模拟I2C. #define SCL PE_ODR_ODR1 #define SDA PE_ODR_ODR2 #define SDAM P ...
- C51单片机模拟I2C总线驱动程序设计
/********************************** I2C总线驱动 ******************************** 模块名:I2C总线驱动 型号:I2C 功能描述 ...
- STM32F207 两路ADC连续转换及GPIO模拟I2C给MT9V024初始化参数
1.为了更好的方便调试,串口必须要有的,主要打印一些信息,当前时钟.转换后的电压值和I2C读出的数据. 2.通过GPIO 模拟I2C对镁光的MT9V024进行参数初始化.之前用我以前公司SP0A19芯 ...
- STM32F10x_模拟I2C读写_硬件I2C读写
STM32F10x_模拟I2C读写EEPROM STM32F10x_硬件I2C读写EEPROM(标准外设库版本) STM32F10x_硬件I2C主从通信(轮询发送,中断接收)
随机推荐
- 浙江大学PAT上机题解析之1014. 福尔摩斯的约会 (20)
1014. 福尔摩斯的约会 (20) 时间限制 50 ms 内存限制 32000 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Y ...
- android中listview的一些样式设置
在Android中,ListView是最常用的一个控件,在做UI设计的时候,很多人希望能够改变一下它的背景,使他能够符合整体的UI设计,改变背景背很简单只需要准备一张图片然后指定属性 android: ...
- Java语言基础(七)
Java语言基础(七) 今天在公司多呆了会,回来晚了 一.自动类型转换 在Java中,数据是可以转换的 例如可以将byte类型的赋给int类型的 这里希望你了解内存的变化,例如 在这里,我想你应该知 ...
- Java Socket 学习笔记
TCP协议的Socket编程 Socket:英文中的意思是插座.两个Java应用程序可以通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket.Java中所有关于网络编程的类都 ...
- Win7设置承载网络 分类: 网络 2014-10-30 09:08 105人阅读 评论(0) 收藏
Win7设置承载网络 (1)最重要的第一步,要知道自己的网卡是否支持承载网络,如果不支持就悲剧地一票否决了,支持的话才能开始以后各步骤的设置. netsh wlan show drivers (2)设 ...
- PTHREAD_MUTEX_INITIALIZER问题
PTHREAD_MUTEX_INITIALIZER 与 expected expression before ‘{’ token 在进行 Posix thread 编程时,出现以下编译错误:err ...
- hadoop之wordCount程序理解
有篇文章http://www.cnblogs.com/xia520pi/archive/2012/05/16/2504205.html中介绍的
- SQL Server Management Studio 使用作业实现数据库备份
1.数数据库备份脚本: 数据库备份:DECLARE @BcpFile VARCHAR(30),@SQLBACKUP VARCHAR(1000),@BcpFullFile VARCHAR(100) SE ...
- java中XMLGregorianCalendar类型和Date类型之间的相互转换
import java.text.SimpleDateFormat;import java.util.Date;import java.util.GregorianCalendar;import ja ...
- sql - 以半月,每月 分组
按半月:完整代码: SELECT siteNumber [站点], CONVERT(VARCHAR(7),day,120)+'-'+ case when day(day) between 1 and ...