新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > IIC接口的操作

        IIC接口的操作

        作者: 時間:2016-11-21 來源:網絡 收藏
        飛利浦

        SDA  SCL

        本文引用地址:http://www.104case.com/article/201611/319120.htm

        每個設備有唯一的地址  之間是主\從關系

        開始信號  結束信號  響應信號(接收方發送)

        在本開發板中使用的RTC芯片M41t11和處理器用IIC總線方式連接

        @******************************************************************************
        @ File: head.S
        @ 功能: 設置SDRAM,將程序復制到SDRAM,然后跳到SDRAM繼續執行
        @******************************************************************************

        .extern main
        .text
        .global _start
        _start:
        @******************************************************************************
        @ 中斷向量,本程序中,除Reset和HandleIRQ外,其它異常都沒有使用
        @******************************************************************************
        b Reset

        @ 0x04: 未定義指令中止模式的向量地址
        HandleUndef:
        b HandleUndef

        @ 0x08: 管理模式的向量地址,通過SWI指令進入此模式
        HandleSWI:
        b HandleSWI

        @ 0x0c: 指令預取終止導致的異常的向量地址
        HandlePrefetchAbort:
        b HandlePrefetchAbort

        @ 0x10: 數據訪問終止導致的異常的向量地址
        HandleDataAbort:
        b HandleDataAbort

        @ 0x14: 保留
        HandleNotUsed:
        b HandleNotUsed

        @ 0x18: 中斷模式的向量地址
        b HandleIRQ

        @ 0x1c: 快中斷模式的向量地址
        HandleFIQ:
        b HandleFIQ

        Reset:
        ldr sp, =4096 @ 設置棧指針,以下都是C函數,調用前需要設好棧
        bl disable_watch_dog @ 關閉WATCHDOG,否則CPU會不斷重啟
        bl clock_init @ 設置MPLL,改變FCLK、HCLK、PCLK
        bl memsetup @ 設置存儲控制器以使用SDRAM
        bl nand_init @ 初始化NAND Flash

        @ 復制代碼到SDRAM中
        ldr r0, =0x30000000 @ 1. 目標地址 = 0x30000000,這是SDRAM的起始地址
        mov r1, #4096 @ 2. 源地址 = 4096,運行地址在SDRAM中的代碼保存在NAND Flash 4096地址開始處
        mov r2, #16*1024 @ 3. 復制長度 = 16K,對于本實驗,這是足夠了
        bl CopyCode2SDRAM @ 調用C函數CopyCode2SDRAM

        bl clean_bss @ 清除bss段,未初始化或初值為0的全局/靜態變量保存在bss段

        msr cpsr_c, #0xd2 @ 進入中斷模式
        ldr sp, =0x31000000 @ 設置中斷模式棧指針

        msr cpsr_c, #0xdf @ 進入系統模式
        ldr sp, =0x34000000 @ 設置系統模式棧指針,

        ldr lr, =ret_initirq @ 設置返回地址
        ldr pc, =init_irq @ 調用中斷初始化函數
        ret_initirq:
        msr cpsr_c, #0x5f @ 設置I-bit=0,開IRQ中斷

        ldr lr, =halt_loop @ 設置返回地址
        ldr pc, =main @ 調用main函數
        halt_loop:
        b halt_loop

        HandleIRQ:
        sub lr, lr, #4 @ 計算返回地址
        stmdb sp!, { r0-r12,lr } @ 保存使用到的寄存器
        @ 注意,此時的sp是中斷模式的sp
        @ 初始值是上面設置的4096

        ldr lr, =int_return @ 設置調用IRQ_Handle函數后的返回地址
        ldr pc, =IRQ_Handle @ 調用中斷分發函數,在interrupt.c中
        int_return:
        ldmia sp!, { r0-r12,pc }^ @ 中斷返回, ^表示將spsr的值復制到cpsr

        #include
        #include "serial.h"
        #include "i2c.h"
        #include "m41t11.h"


        int main()
        {
        char c;
        char str[200];
        int i;
        struct rtc_time dt;

        uart0_init(); // 波特率115200,8N1(8個數據位,無校驗位,1個停止位)

        i2c_init();

        while (1)
        {
        printf("rn##### RTC Menu #####rn");
        printf("Data format: year.month.day w hour:min:sec, w is week daynr");
        printf("eg: 2007.08.30 4 01:16:57nr");
        printf("[S] Set the RTCnr");
        printf("[R] Read the RTCnr");
        printf("Enter your selection: ");

        c = getc();
        printf("%cnr", c);
        switch (c)
        {
        case s:
        case S:
        {
        printf("Enter date&time: ");
        i = 0;
        do
        {
        c = getc();
        str[i++] = c;
        putc(c);
        } while(c != n && c != r);
        str[i] = ;

        while(--i >= 0)
        {
        if (str[i] < 0 || str[i] > 9)
        str[i] = ;
        }

        sscanf(str, "%d %d %d %d %d %d %d",
        &dt.tm_year, &dt.tm_mon, &dt.tm_mday,
        &dt.tm_wday,
        &dt.tm_hour, &dt.tm_min, &dt.tm_sec);

        printf("nr*** Date set as: %04d.%02d.%02d %d %02d:%02d:%02d ***nr",
        dt.tm_year, dt.tm_mon, dt.tm_mday,
        dt.tm_wday,
        dt.tm_hour, dt.tm_min, dt.tm_sec);

        if (m41t11_set_datetime(&dt))
        printf("Set RTC failed!nr");

        break;
        }

        case r:
        case R:
        {
        if (m41t11_get_datetime(&dt))
        printf("Read RTC failed!nr");

        printf("nr*** Now is: %04d.%02d.%02d %d %02d:%02d:%02d ***nr",
        dt.tm_year, dt.tm_mon, dt.tm_mday,
        dt.tm_wday,
        dt.tm_hour, dt.tm_min, dt.tm_sec);

        break;
        }
        }

        }




        關鍵詞: IIC接口SDRA

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 许昌市| 贵州省| 江门市| 铜梁县| 洛宁县| 浑源县| 上饶县| 普宁市| 深水埗区| 曲阜市| 澜沧| 双城市| 文登市| 越西县| 阳西县| 徐闻县| 临朐县| 凤阳县| 厦门市| 迁西县| 曲靖市| 岱山县| 工布江达县| 石狮市| 庆阳市| 信宜市| 鄂伦春自治旗| 徐闻县| 闻喜县| 县级市| 乌拉特后旗| 阿城市| 阳东县| 台北县| 宜黄县| 邵阳市| 祥云县| 五河县| 抚州市| 宁阳县| 崇阳县|