zoukankan      html  css  js  c++  java
  • 嵌入式LINUX入门到实践(二)

    这篇中将围绕韦东山LINUX第二部分教程源码,对IIC协议进行程序实现上的分析。

    /* I2C registers */
    #define IICCON      (*(volatile unsigned *)0x54000000)   // IIC control
    #define IICSTAT     (*(volatile unsigned *)0x54000004)  // IIC status
    #define IICADD      (*(volatile unsigned *)0x54000008)  // IIC address
    #define IICDS       (*(volatile unsigned *)0x5400000c)   // IIC data shift
    #define IICLC        (*(volatile unsigned *)0x54000010)  //IIC multi-master line control

    unsigned char at24cxx_read(unsigned char address)
    {
        unsigned char val;
        printf("at24cxx_read address = %d ", address);
        i2c_write(0xA0, &address, 1);
        printf("at24cxx_read send address ok ");
        i2c_read(0xA0, (unsigned char *)&val, 1);
        printf("at24cxx_read get data ok ");
        return val;
    }
    void at24cxx_write(unsigned char address, unsigned char data)
    {
        unsigned char val[2];
        val[0] = address;
        val[1] = data;
        i2c_write(0xA0, val, 2);
    }

    首先分析功能实现函数:读与写函数,其中读函数中,先实现发送地址再进行读数据。


    /*
     * 主机发送
     * slvAddr : 从机地址,buf : 数据存放的缓冲区,len : 数据长度
     */
    void i2c_write(unsigned int slvAddr, unsigned char *buf, int len)
    {
        g_tS3C24xx_I2C.Mode = WRDATA;   // 写操作
        g_tS3C24xx_I2C.Pt   = 0;        // 索引值初始为0
        g_tS3C24xx_I2C.pData = buf;     // 保存缓冲区地址
        g_tS3C24xx_I2C.DataCount = len; // 传输长度   
        IICDS   = slvAddr;
        IICSTAT = 0xf0;         // 主机发送,启动   
        /* 等待直至数据传输完毕 */    
        while (g_tS3C24xx_I2C.DataCount != -1);
    }

    /*
     * 主机接收
     * slvAddr : 从机地址,buf : 数据存放的缓冲区,len : 数据长度
     */
    void i2c_read(unsigned int slvAddr, unsigned char *buf, int len)
    {
        g_tS3C24xx_I2C.Mode = RDDATA;   // 读操作
        g_tS3C24xx_I2C.Pt   = -1;       // 索引值初始化为-1,表示第1个中断时不接收数据(地址中断)
        g_tS3C24xx_I2C.pData = buf;     // 保存缓冲区地址
        g_tS3C24xx_I2C.DataCount = len; // 传输长度
        
        IICDS        = slvAddr;
        IICSTAT      = 0xb0;    // 主机接收,启动
        
        /* 等待直至数据传输完毕 */    
        while (g_tS3C24xx_I2C.DataCount != 0);
    }

  • 相关阅读:
    POJ1521 最优哈夫曼编码树 贪心算法的有效应用
    hdu4911逆序对+mergesort
    hdu1735 字数统计 贪心算法
    最大不相交区间数+最少区间数覆盖问题 贪心思想
    洛谷1010 幂次方 分治算法+掩码的应用
    POJ 2082 三种解法(暴力+树状数组+线段树)
    POJ3134 Power Calculus IDA*搜索的一个应用
    hdu2648 STL map的简单应用
    Delphi 数据类型与Windows 数据类型 对照
    Delphi Window Messages 消息
  • 原文地址:https://www.cnblogs.com/wangxiu/p/4702270.html
Copyright © 2011-2022 走看看