1. IIC
1.1 定义(同步串行半双工通信总线)
IIC(Inter-Integrated Circuit)又称I2C,是是IICBus简称,所以中文应该叫集成电路总线。是飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展而来的一种同步串行半双工通信总线方式。该总线允许同时连接多个设备(芯片)。每块芯片在总线上拥有特定的地址。自2006年10月1日起,使用I²C协议已经不需要支付专利费,但制造商仍然需要付费以获取IIC从属设备地址。
1.2 作用
- 设备间通信:I²C用于微控制器和各种外围设备(如传感器、EEPROM、ADC/DAC、LCD显示器等)之间的数据传输。
- 多主多从结构:I²C支持多主多从架构,允许多个主设备和多个从设备在同一总线上通信。
- 地址分配:每个从设备在总线上都有一个唯一的地址,主设备通过该地址来选择并与特定从设备通信。
- 时钟同步:I²C使用单主时钟同步,主设备生成时钟信号,从设备响应时钟信号进行数据传输。
- 双向数据传输:I²C支持双向数据传输,主设备可以向从设备发送数据,也可以从从设备读取数据。
1.3 IIC的组网模式
上图所示是IIC的总线的使用场景,所有挂载在IIC总线上的设备都有两根信号线,一根是数据线SDA,另一根是时钟线SCL。这两个信号线都是双向的。
作为一种通信方式,IIC总线在某一时刻,总线只允许有一个设备处于发送状态,所发出的数据被总线上所有的设备所接收。IIC通信协议包含有设备地址,只有发送方携带的地址与某个接收方的地址相同时,接收方才真正执行相关的指令。
IIC总线规定,设备在空闲时,两根总线都处于高电平状态。为保证这种状态,数据线SDA和时钟线SCL都要外接上拉电阻。上拉电阻的阻值一般位4.7~10K。。I2C 总线标准模式下速度可以达到 100Kb/S,快速模式下可以达到 400Kb/S。I2C 总线工作是按照一定的协议来运行的,接下来就看一下 I2C 协议。
1.4 IIC代码
#include <s3c2440.h>
#include <string.h>
#include <stdio.h>
#include "led.h"
#include "key.h"
#include "interrupt.h"
#include "delay.h"
#include "pwm.h"
#define ADDRESS 0X08
void init_wdt(void) //初始化看门狗,禁止启动,关闭看门狗
{
WTCON &= ~(1 << 0);
}
void init_clk(void)
{
unsigned int t = MPLLCON; //将PCLK频率存入变量设置好再进行修改,防止频率修改中途器件因为频率过高而短路
t &= ~((0xff << 12) | (0x3f << 4) | (3 << 0)); //利用锁相环将12MHz倍频
t |= ((127 << 12) | (2 << 4) | (1 << 0)); //配置fclk频率大约为400Mhz
CLKDIVN |= ((2 << 1) | (1 << 0));//分频,配置HCLK为100MHz,HCLK为50MHz
MPLLCON = t;//将所有频率配置好再进行设置,防止器件被烧坏
}
unsigned char buffer[128] = {0};//存储pc给s3c2440发送,s3c2440接收到的字符串
unsigned char tmpbuffer[128];
unsigned int pos;//已经收到字符的个数,下一个要收到字符的位置
void uart0_handler(void)
{
if (SUBSRCPND & (1 << 0))//如果UART0接收到了数据
{
buffer[pos++] = URXH0;
}
SUBSRCPND = SUBSRCPND;
}
void init_uart0(void)
{
unsigned int t = 0;
GPHCON &= ~(0x0f << 4);
GPHCON |= ((2 << 6) | (2 << 4));//设置中断模式,串口电路引脚寄存器功能
t = ULCON0; //9600 n 8 1 波特率? 校验位? 数据位? 停止位
t &= ~(1 << 6);//不使用红外模式
t &= ~(7 << 3);//无奇偶校验
t &= ~(1 << 2);//每帧 1 个停止位
t |= (3 << 0);//每帧用于发送或接收的数据位的个数8位
ULCON0 = t;
t = UCON0; //s3c2440给电脑发送数据用轮询 电脑给s3c2440发送数据,s3c2440接收数据触发中断
t &= ~(3 << 10);//选PCLK给 UART 波特率
t &= ~(3 << 8);//发送接收方式改为脉冲方式
t &= ~(0x0f << 4);// 都设置为普通模式
t &= ~(0x0f << 0);
t |= (0x05 << 0);//设置UART模式发送轮询 接收模式为中断
UCON0 = t;
INTSUBMSK &= ~(1 << 0);//uart子中断改为可服务状态
enable_irq(IRQ_UART0);//配置中断为IRQ模式,让中断处于可服务模式 //配置接收的中断
register_irq(IRQ_UART0 ,uart0_handler);
UBRDIV0 = 325;//波特率分频寄存器 50000000/9600/16-1约等于325
pos = 0;
}
void uart0_send_char(u