IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> IIC设计 -> 正文阅读

[嵌入式]IIC设计

一.IIC初始化

1.IIC中断初始化

2.SCL时钟设置

3.设置IICSTAT

4.设置引脚功能

5.允许产生应答信号

二.IIC写一个字节

1.设置处理器主设备为发送模式

2.将从设备地址写入到IICDS寄存器

3.写入0xf0到IICSTAT

4.等待ack的产生

5.写入从设备要写入的地址到IICDS寄存器

6.等待ack产生

7.将要传输的数据写入IICDS寄存器

8.等待ack的产生

9.写入0xd0到IICSTAT

10.清除中断

三.IIC写一个字节

1.设置处理器主设备为发送模式

2.将主设备地址写入到IICDS寄存器

3.写入0xf0到IICSTAT

4.等待ack的产生

5.写入从设备要写入的地址到IICDS寄存器

6.等待ack产生

7.设置处理器为接收模式

7.1取出数据

7.2清除中断

7.3等待中断

8.写入0x90到IICSTAT

9清除中断

代码

#define INTPND (*(volatile unsigned long*)0x4a000010)
#define SRCPND (*(volatile unsigned long*)0x4a000000)
#define INTMSK (*(volatile unsigned long*)0x4a000008)
#define GPECON (*(volatile unsigned long*)0x56000040)
#define GPEUP ?(*(volatile unsigned long*)0x56000048)

#define IICCON ? ?(*(volatile unsigned char*)0x54000000)
#define IICSTAT ? (*(volatile unsigned char*)0x54000004)
#define IICDS ? ? (*(volatile unsigned char*)0x5400000C)

#define SLAVE_WRITE_ADD 0xa0
#define SLAVE_READ_ADD 0xa1


void delay(int i)
{
? ?int j = 0;
? ?while (i--)?? ?
? ?{
? ? ? ?for (j=0;j<100;j++)
? ? ? ?{?? ?
? ? ? ? ? ?;
? ? ? ?} ?
? ?}?? ?
}


void i2c_init()
{
? ? //1.a 初始化中断
? ? INTPND |= (1<<27);
? ? SRCPND |= (1<<27); ?
? ? INTMSK &= ~(1<<27);
? ? ?
? ? IICCON |= (1<<5);?
? ??
? ? //1.b 设置scl时钟
? ? IICCON &= ~(1<<6);
? ? IICCON &= ~(0xf<<0);
? ? IICCON |= (0x5<<0);
? ??
? ? //2. 设置IICSTAT?? ?
? ? IICCON |= (1<<4);
? ??
? ? //3.设置引脚功能
? ? GPECON |= (0x2<<28)|(0x2<<30);
? ? GPEUP |= (0x3<<14);
? ??
? ? //4.允许产生ACK
? ? IICCON |= (1<<7);
}


void write_byte(unsigned char xchar, unsigned char daddr)
{
? ??
? ? //1. 设置处理器为主设备+发送模式
? ? IICSTAT |= (3<<6);
? ??
? ? //2. 将从设备的地址写入到IICDS寄存器
? ? IICDS = SLAVE_WRITE_ADD;
? ? IICCON &= ~(1<<4);
? ??
? ? //3. 写入0xF0写入IICSTAT
? ? IICSTAT = 0xF0;
? ??
? ? //4. 等待ACK的产生
? ? while ((IICCON & (1<<4)) == 0 )
? ? ? ? delay(100);
? ??
? ? //5.1写入字节的地址到IICDS寄存器
? ? IICDS = daddr;
? ? IICCON &= ~(1<<4);
? ??
? ? //5.2等待ACK的产生
? ? while ((IICCON & (1<<4)) == 0 )
? ? ? ? delay(100);
? ??
? ? //6. 将要传输的字节数据写入IICDS寄存器
? ? IICDS = xchar;
? ? IICCON &= ~(1<<4); ??
? ??
? ? //8. 等待ACk的产生
? ? while ((IICCON & (1<<4)) == 0 )
? ? ? ? delay(100);
? ??
? ? //9. 写入0xD0到IICSTAT
? ? IICSTAT = 0xD0;
? ??
? ? //10. 清除中断?? ?
? ? IICCON &= ~(1<<4);?? ?
? ??
? ? delay(100);
}

void read_data(unsigned char *buf, unsigned char daddr, int length)
{
? ? int j =0;
? ? unsigned char unusedata;
? ??
? ? //1. 设置为主设备发送模式
? ? IICSTAT |= (3<<6);
? ??
? ? //写入从设备地址
? ? IICDS = SLAVE_WRITE_ADD;
? ? IICCON &= ~(1<<4);
? ??
? ? //写入0xF0到IICSTAT
? ? IICSTAT = 0xF0;
? ??
? ? //等待ACK
? ? while ((IICCON & (1<<4)) == 0 )
? ? ? ? delay(100);
? ??
? ? //写入eeprom内部地址
? ? IICDS = daddr;
? ? IICCON &= ~(1<<4);
? ??
? ? //等待ACK
? ? while ((IICCON & (1<<4)) == 0 )
? ? ? ? delay(100);
? ? ? ? ? ??
? ??
? ? //设置为主设备接收模式
? ? IICSTAT &= ~(3<<6);
? ? IICSTAT |= (2<<6);
? ??
? ??
? ? //2.写入从设备地址到IICDS
? ? IICDS = SLAVE_READ_ADD;
? ? IICCON &= ~(1<<4);
? ??
? ??
? ? //3.写入0xB0到IICSTAT开始接收
? ? IICSTAT = 0xb0;
? ? while ((IICCON & (1<<4)) == 0 )
? ? ? ? delay(100);
? ? ? ??
? ??
? ? ?? ?/*写入设备内部地址*/
?? ?IICDS = daddr;
?? ?IICCON &= ~(1 << 4);
?? ?while((IICCON & (1 << 4)) == 0)
?? ?{
?? ??? ?delay(100);
?? ?}?? ?
?? ? ? ??
? ??
? ? //丢掉收到的第1个字节
? ? unusedata = IICDS;
? ? IICCON &= ~(1<<4);
? ? while ((IICCON & (1<<4)) == 0 )
? ? ? ? ? ? delay(100);
? ??
? ? for(j=0;j<length;j++)
? ? {
? ? ? ? if(j == (length -1))
? ? ? ? {
? ? ? ? ? ?IICCON &= ~(1<<7); ?? ??? ?
? ? ? ? }
? ?
? ? //5.1 从IICDS里取出数据
? ? ? ? buf[j]=IICDS;
? ??
? ? //5.2 清除中断
? ? ? ? IICCON &= ~(1<<4);
? ??
? ? //4.等待中断
? ? ? ? while ((IICCON & (1<<4)) == 0 )
? ? ? ? ? ? delay(100);
? ? }
? ? ?? ?
? ? ?? ?
? ? //写入0x90到IICSTAT
? ? IICSTAT = 0x90;
? ??
?
? ? // 清除中断
? ? IICCON &= ~(1<<4);
}

void i2c_test()
{
? ? int i=0;
? ? unsigned char sbuf[256]={0};
? ? unsigned char dbuf[256]={0};?? ?
?? ?
? ? i2c_init();
? ??
? ? for(i=0;i<256;i++)
? ? {
? ? ?? ?sbuf[i] = i+1;
? ? ?? ?dbuf[i] = 0;
? ? }
? ??
? ? printf("dbuf befor I2C read:\r\n");
? ??
? ? for(i =0; i<256;i++)
? ? {
? ? ? ?if(i%8==0)
? ? ? ? ? ?printf("\r\n");
? ? ? ? ? ?
? ? ? ?printf("%d\t",dbuf[i]);?? ?
? ? }?? ?
? ??
? ? for(i=0;i<256;i++)
? ? ? ? write_byte(sbuf[i],i);
? ? ? ??
? ? printf("i2c reading, plese wait!\n\r");
? ??
? ? read_data(dbuf,0,256);
? ??
? ? printf("dbuf after I2C read:\r\n");
? ??
? ? for(i =0; i<256;i++)
? ? {
? ? ? ?if(i%8==0)
? ? ? ? ? ?printf("\r\n");
? ? ? ? ? ?
? ? ? ?printf("%d\t",dbuf[i]);?? ?
? ? }?? ?
}
?

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-01-30 19:05:27  更:2022-01-30 19:07:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:38:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码