• I2C模块 外接EEPROM和相关知识点


    /*
    * File: main.c
    * Author: Colder
    *
    * Created on 2016-11-17,5:02
    *
    */


    #include <stdio.h>
    #include <stdlib.h>
    #include "p30f6014.h"


    unsigned long int i;
    unsigned int WriteTable[16] = {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff};
    unsigned int ReadTable[16];

    unsigned int ControlByteW = 0xa0;
    unsigned int ControlByteR = 0xa1;

    unsigned int AddressH = 0x00;
    unsigned int AddressL = 0x00;

    void ConfigeI2CEEPROM(){

    SRbits.IPL = 7;//禁用中断
    TRISG = TRISG&0xfeff;
    I2CCONbits.I2CEN = 1;//s使能I2C模块
    I2CBRG = 0xFA;
    }

    void PageWrite(){

    I2CCONbits.SEN = 1;
    while(I2CCONbits.SEN == 1);
    I2CTRN = ControlByteW;
    while(I2CSTATbits.TRSTAT == 1);
    I2CTRN = AddressH;
    while(I2CSTATbits.TRSTAT == 1);
    I2CTRN = AddressL;
    while(I2CSTATbits.TRSTAT == 1);
    for(i = 0;i<16;i++){

    I2CTRN = WriteTable[i];
    while(I2CSTATbits.TRSTAT == 1);
    }
    I2CCONbits.PEN = 1;
    while(I2CSTATbits.TRSTAT == 1);
    }

    void PageRead(){

    I2CCONbits.SEN = 1;
    while(I2CCONbits.SEN == 1);
    I2CTRN = ControlByteW;
    while(I2CSTATbits.TRSTAT == 1);
    I2CTRN = AddressH;
    while(I2CSTATbits.TRSTAT == 1);
    I2CTRN = AddressL;
    while(I2CSTATbits.TRSTAT == 1);
    I2CCONbits.RSEN = 1;
    while(I2CCONbits.RSEN == 1);
    I2CTRN = ControlByteR;
    while(I2CSTATbits.TRSTAT == 1);
    for(i=0;i<16;i++){

    I2CCONbits.RCEN = 1;
    while(I2CSTATbits.RBF == 0);
    ReadTable[i] = I2CRCV;
    I2CCONbits.ACKDT = 0;
    if(i==15)
    I2CCONbits.ACKDT = 1;
    I2CCONbits.ACKEN = 1;
    while(I2CCONbits.ACKEN == 1);
    }
    I2CCONbits.PEN = 1;
    while(I2CCONbits.PEN == 1);
    }
    int main(){

    ConfigeI2CEEPROM();
    PORTGbits.RG8 = 0;
    PageWrite();
    for(i=0;i<650000;i++);
    PageRead();
    while(1);
    }


    //***********************************
    // I2CRCV 接收寄存器
    // I2CTRN 发送寄存器
    // I2CBRG 波特率发生器
    // I2CCON 控制寄存器
    // I2CSTAT 状态寄存器
    // I2CADD 地址寄存器

    //************************************
    // I2CCON下的重要标志位:
    // ACKDT 应答数据位(工作于主控器件模式,适用于主控器件的接受过程),当软件起动应答序列时将发送该值
    // ACKEN 应答序列使能位(工作于主控器件,适用于主控器件接受过程).
    // RCEN 接收使能位(作为主控器件工作时)
    // PEN 停止条件使能位(作为主控器件工作时)
    // SEN 起动条件使能位-(起动后序列结束时,由硬件清0)


    //************************************
    // I2CSTAT下的重要标志位:
    // TRSTAT 发送状态位 (1-主控器件正在发送过程中)
    // RBF 接收缓冲器满状态位(1-接收完成,I2CRCV满/0-接收未完成,I2CRCV空)

    //***********************************

    // SI2CIF为从动器件中断,在检测到地址为从动器件地址时激活中断.下列事件会产生SI2CIF中断:

    //1.检测到有效器件地址(包括广播呼叫方式的地址)

    //2.发送数据的请求

    //3.接收到数据

  • 相关阅读:
    Python学习 之 文件
    Python学习 之 对内存的使用(浅拷贝和深拷贝)
    Python学习 之 爬虫
    Python学习 之 正则表达式
    为何现在的网页广告都是有关你搜索或者购买过的商品 2015-08-22 22:06 1534人阅读 评论(35) 收藏
    Junit使用注意点
    用递归方式在JSON中查找对象
    利用StringBuffer来替换内容
    使用ant时 出现 java.lang.OutOfMemoryErro r: Java heap space的解决办法
    python-re使用举例
  • 原文地址:https://www.cnblogs.com/chenbokai/p/6076281.html
Copyright © 2020-2023  润新知