《ARM嵌入式体系结构与接口技术(Cortex-A9版)知识题目解析.docx》由会员分享,可在线阅读,更多相关《ARM嵌入式体系结构与接口技术(Cortex-A9版)知识题目解析.docx(33页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、,第一章1简述ARM可以工作的几种模式。答:ARMv7-A架构处理器共有8种工作模式,即用户模式(User)、快速中断模式(FIQ)、外部中断模式(IRQ)、特权模式(Supervisor)、数据访问中止模式(Abort)、未定义指令中止模式(Undef)、系统模式(System)、监控模式(Monitor)2ARM 核有多少个寄存器?答:ARM处理器有40个32位长的寄存器3什么寄存器用于存储PC和LR寄存器?答:R15和R14寄存器4R13通常用来存储什么?答:R13通常用来存储堆栈指针5哪种模式使用的寄存器最少?答:用户模式(User)和系统模式(System),因为这两种模式下没有SP
2、SR寄存器6CPSR 的哪一位反映了处理器的状态?答:T位是处理器的状态控制位第二章1熟悉 Eclipse 开发环境。答:略,参照第2.3节2新建一个工程,编写一个汇编程序实现3+13=16的操作。答:略,参照第2.6节第三章1用 ARM 汇编实现下面列出的操作。R0=15 R0=R1/16(有符号数)R1=R2*3R0=R0答:R0=15 - MOV R0,#15R0=R1/16 - MOV R0,R1,ASR #4 BIC R0, R0, #0x78000000R1=R2*3 - MOV R3, #3MUL R1,R2,R3R0=R0 - MOV R1, #-1 MOV R2, R0MUL
3、 R0,R1,R22BIC 指令的作用是什么?答:将一个寄存器中的某一位或者某几位清零3执行 SWI 指令时会发生什么情况?答:执行SWI指令时ARM处理器会自动将CPSR拷贝到SVC模式下的SPSR,然后修改CPSR寄存器的T位使处理器进入ARM状态,修改CPSR寄存器的低五位模式位使处理器进入SVC模式,修改CPSR寄存器的I位禁止IRQ中断,保存当前SWI指令下一条指令的地址到SVC模式下的LR寄存器,然后PC的值改为异常向量表中偏移地址为0x08的地址。4B、BL、BX 指令的区别有哪些?答:B与BL都可以使程序跳转到指定的地址(label)处执行程序B 跳转指令 pclabelBL
4、带返回的连接跳转 pclabel,同时将BL下一条指令地址保存到LRBX使程序跳转到指令中指定的地址执行程序,并将的第0位复制到CPSR中T位,BX BX 跳转并切换状态 pcRm&0xfffffffe,TRm05下面哪个数据可以作为数据操作指令的有效立即数?0x101 0x1f8 0xf000000f 0x08000012 0x104答:0x1f8、0xf000000f、0x1046ARM 在哪些工作模式下可以修改 CPSR 寄存器?答:特权模式下才能修改CPSR寄存器,即快速中断模式(FIQ)、外部中断模式(IRQ)、特权模式(Supervisor)、数据访问中止模式(Abort)、未定义
5、指令中止模式(Undef)、系统模式(System)、(Cortex-A系列)监控模式(Monitor)7写一个程序,如果 R0 的值大于 0x50,则将 R1 的值减去 0x10,并把结果送给 R0。答:CMP R0, #0x50SUBGT R0,R1,#0x108编写一段 ARM 汇编程序,实现数据块复制,将 R0 指向的 8 个字的连续数据保存到 R1 指向的一段连续的内存单元中。答:LDMIA R0!,R2-R9STMIA R1!,R2-R9第四章1在 ARM 汇编中如何定义一个全局的数字变量?答:使用.global伪操作语法格式:.global 全局变量名 并且被初始化为02ADR
6、和 LDR 的用法有什么区别?答:ADR 伪指令的功能是把标签所在的地址加载到寄存器中LDR伪指令用于装载一个32位的常数或地址到寄存器中3AAPCS 中规定的 ARM 寄存器的使用规则是什么?答:AAPCS 中定义了 ARM 寄存器使用规则如下。(1)在进行子函数调用时,当子函数中有参数时,子程序间通过寄存器 R0、R1、R2、R3 来传递参数,如果参数多于 4 个,则多出的部分用堆栈传递,被调用的子程序在返回前无须恢复寄存器 R0R3 的内容。(2)在子程序中,使用寄存器 R4R11 来保存局部变量。如果在子程序中使用到了 R4R11 中的某些寄存器,子程序进入时必须保存这些寄存器的值,在
7、返回前必须恢复这些寄存器的值;对于子程序中没有用到的寄存器则不必进行这些操作。在 Thumb 程序中,通常只能使用寄存器R4R7 来保存局部变量。(3)寄存器 R12 用作子程序间 scratch 寄存器(用于保存 SP,在函数返回时使用该寄存器出栈),记作 ip。在子程序间的连接代码段中常使用这种规则。(4)寄存器 R13 用作数据栈指针,记作 sp,sp 中存放的是当前使用的栈的栈顶的地址。在子程序中寄存器 R13 不能用作其他用途。寄存器 sp 在进入子程序时的值和退出子程序时的值必须相等。(5)寄存器 R14 称为连接寄存器,记作 lr。它用于保存子程序的返回地址。如果在子程序中保存了
8、返回地址,寄存器 R14 则可以用作其他用途。(6)寄存器 R15 是程序计数器,记作 pc。它不能用作其他用途。4什么是内联汇编?答:在C代码中插入汇编语言的方法称为内联汇编。5汇编代码中如何调用 C 代码中定义的函数?答:(1)调用的C带有参数,需要使用R0R3寄存器进行参数的传递,如果参数多于四个多出来的部分使用堆栈传递。(2)调用C程序时,使用BL跳转指令,格式为: BL 函数名(3)如果C程序带有返回值,使用寄存器R0传递。第五章1什么是 GPIO?答:GPIO 的英文全称为 General-Purpose IO ports,也就是通用 IO 接口。2Exynos4412 有几组 G
9、PIO 端口?答:Exynos4412有37组GPIO端口3编程实现利用 Exynos4412 的 GPIO 控制 LED3 闪烁。答:.text 定义一个代码段.global _start 定义一个全局的标号 _start_start: 汇编的入口,相当于c的main函数ldr r0, =0x11000c20 配置引脚的功能,将GPX1CON寄存器的3:0这个位于设置为0x1ldr r4, r0bic r4, #0xforr r4, #0x1str r4, r0loop:bl led_on 点亮LED3bl delay延时bl led_off熄灭LED3bl delay延时b loop相当于
10、C程序中的while(1), 防止程序跑飞led_on:ldr r1, =0x11000c24 配置GPX1_0引脚输出高电平ldr r5, r1orr r5, #0x1str r5, r1mov pc, lrled_off:ldr r1, =0x11000c24配置GPX1_0引脚输出低电平ldr r5, r1bic r5, #0x1str r5, r1mov pc, lrdelay: 延时函数mov r7, #0x10000000ms:sub r7, #1cmp r7, #0moveq pc, lrb ms.end 代表汇编的结束第六章1异常向量表位于存储器的什么位置?答:存储器映射地址
11、0x00000000 是为向量表(一组 32 位字)保留的。也可通过设置CP15 的C12寄存器将异常向量表的首地址设置在任意地址2IRQ 或 FIQ 异常的返回指令是什么?答;SUBS PC, LR, #43什么类型的异常优先级最高?答:RESET异常4什么指令可以放在中断向量表答:跳转指令(B Lable)LDR指令(LDR PC,Lable地址)5ARM 中断控制器有什么作用?答:ARM 内核只有两个外部中断输入信号nFIQ和nIRQ。但对于一个系统来说,中断源可能多达几十个。为此,在系统集成时,一般都会有一个中断控制器来处理异常信号。这时候用户程序可能存在多个IRQ/FIQ的中断处理函
12、数。为了使从向量表开始的跳转始终能找到正确的处理函数入口,需要设置处理机制和方法。不同的中断控制器处理方法不同。6编程实现按键 K3 的中断检测,当按键按下时打印相应信息。答:#include exynos_4412.h#include uart.h/* 中断处理函数 */void do_irq()int irq_num;/* 读中断号 */irq_num = CPU0.ICCIAR & 0x3ff;/* 判断是哪个中断发生了 */switch (irq_num)/case 57:case 58:/key3按下了/* 清中断挂起位*/EXT_INT41_PEND = 0x4;printf(Th
13、e KEY3 is pressed!n);break;/case 59:/case 60:default:break;/* 把当前发生的中断的中断号写回到EOIR寄存器,表示对当前中断已经处理完成,可以响应下一个中断 */CPU0.ICCEOIR = CPU0.ICCEOIR & (0x3ff 0) | irq_num;void interrupt_init()/* 1. 配置GPX1_2引脚作为中断功能 */GPX1.CON = GPX1.CON & (0xf 8) | (0xf 8);/* 2. 设置中断的触发方式-下降沿触发 */EXT_INT41_CON = EXT_INT41_CON
14、 & (0x7 8) | (0x2 8);/* 3. 打开GPIO控制器上的使能开关,让中断能到达GIC */EXT_INT41_MASK = EXT_INT41_MASK & (0x1 2);/*GIC*/* 4. 打开58号中断在GIC中对应的开关 */ICDISER.ICDISER1 = ICDISER.ICDISER1 | (0x1 26);/* 5. 把58号中断分发给CPU0来处理 */ICDIPTR.ICDIPTR14 = ICDIPTR.ICDIPTR14 & (0xff 16) | (0x1 16);/* 6. 打开分发使能的总开关,让58号中断能到达CPU接口 */ICDD
15、CR = ICDDCR | (0x1 0);/* 7. 打开CPU接口到达所连接的处理器的总开关 */CPU0.ICCICR = CPU0.ICCICR | (0x1 0);/* 8. 设置优先级的门限,为了让所有中断都通过,把优先级设最低(值最大) */CPU0.ICCPMR = CPU0.ICCPMR & (0xff 0) | (0xff 0);int main()/初始化按键中断interrupt_init();/初始化串口uart_init();while(1);return 0;第七章1串行通信与并行通信的概念是什么?答:串行通信是指计算机与 I/O 设备之间数据传输的各位是按顺序依
16、次一位接一位进行传送。并行通信是指计算机与 I/O 设备之间通过多条传输线交换数据,数据的各位同时进行传送。2同步通信与异步通信的概念及区别是什么?答:概念:异步通信,是指数据传送以字符为单位,字符与字符间的传送是完全异步的,位与位之间的传送基本上是同步的。同步通信,是指数据传送是以数据块(一组字符)为单位,字符与字符之间、字符内部的位与位之间都同步。区别:异步通信:(1)以字符为单位传送信息。(2)相邻两字符间的间隔是任意长。(3)因为一个字符中的波特位长度有限,所以需要的接收时钟和发送时钟只要相近就可以。(4)异步方式特点就是:字符间异步,字符内部各位同步。同步通信: (1)以数据块为单位
17、传送信息。(2)在一个数据块(信息帧)内,字符与字符间无间隔。(3)因为一次传输的数据块中包含的数据较多,所以接收时钟与发送时钟严格同步,通常要有同步时钟。3RS-232C 串口通信接口规范是什么?答:略,参照本书7.1.7节 4在 Exynos4412 串口控制器中,哪个寄存器用来设置串口波特率?答:UBRDIVn和UFRACVALn第八章1PWM 输出波形的特点是什么?答:若令频率不变,直接改变脉冲的宽度,亦即控制开关元件的导通时间;比如现在是高电平导通,那么高电平时间越长,低电平时间越短,导通时间就长;否则就越短。2编程实现输出占空比为 21、波形周期为 9ms 的 PWM 波形。答:#
18、include exynos_4412.hint main()/* 1. 配置GPD0_0引脚作为PWM的输出功能 */GPD0.CON = GPD0.CON & (0xf 0) | (0x2 0);/* 2. 设置一级分频系数和二级分频系数 ,周期为1us */PWM.TCFG0 = PWM.TCFG0 & (0xff 0) | (99 0);PWM.TCFG1 = PWM.TCFG1 & (0xf 0);/* 3. 设置PWM输出脉冲的周期和占空比 */PWM.TCNTB0 = 9000;PWM.TCMPB0 = 3000;/* 4. 打开手动更新,更新TCNTB的值到递减计数器 */PW
19、M.TCON = PWM.TCON | (1 1);/* 5. 关闭手动更新,打开自动重装载功能 */PWM.TCON = PWM.TCON | (1 3);/* 6.将手动装载关闭*/PWM.TCON = PWM.TCON & (1 1);/* 7. 开启PWM */PWM.TCON |= (0x10);while(1);return 0;第九章1在控制系统中为何要加入看门狗功能?答:检测程序的正常运行,当程序跑死后,看门狗产生一个强制系统复位。这样可以使程序重新运行,减小程序跑死的危害。2编程实现看门狗定时器作为普通 16 为定时器功能,定时 1s 循环打印信息。#include exyn
20、os_4412.h/* 中断处理函数 */void do_irq()int irq_num;/* 读中断号 */irq_num = CPU0.ICCIAR & (0x3ff 0);/* 判断是哪个中断发生了 */switch (irq_num)case 75: /1S定时时间到/* 清中断 */WDT.WTCLRINT = 1;ICDICPR.ICDICPR2 = ICDICPR.ICDICPR2 | (0x1 11);printf(The WDT_Timer 1S!n);break;default:break;/* 把当前发生的中断的中断号写回到EOIR寄存器,表示对当前中断已经处理完成,可
21、以响应下一个中断 */CPU0.ICCEOIR = CPU0.ICCEOIR & (0x3ff 0) | irq_num;void interrupt_init()/*GIC*/* 1. 打开75号中断在GIC中对应的开关 */ICDISER.ICDISER2 = ICDISER.ICDISER2 | (0x1 11);/* 2. 把75号中断分发给CPU0来处理 */ICDIPTR.ICDIPTR18 = ICDIPTR.ICDIPTR18 & (0xff 24) | (0x1 24);/* 3. 打开分发使能的总开关,让75号中断能到达CPU接口 */ICDDCR = ICDDCR | (
22、0x1 0);/* 4. 打开CPU接口到达所连接的处理器的总开关 */CPU0.ICCICR = CPU0.ICCICR | (0x1 0);/* 5. 设置优先级的门限,为了让所有中断都通过,把优先级设最低(值最大) */CPU0.ICCPMR = CPU0.ICCPMR & (0xff 0) | (0xff 0);void wdt_init(void)/*1.设置一级预分频值 = 100000000 / (249 + 1) = 400000HZ*/WDT.WTCON = WDT.WTCON | (249 8);/*2.设置二级预分频值 = 400000 / 128 = 3125HZ*/W
23、DT.WTCON = WDT.WTCON | (0x3 3);/*3.禁止看门狗定时器复位功能*/WDT.WTCON = WDT.WTCON & (0x1);/*4.使能看门狗定时器能够中断信号*/WDT.WTCON = WDT.WTCON | (0x1 2);/*5.给递减计数器赋初值 喂狗*/WDT.WTDAT = 3125;WDT.WTCNT = 3125;/*6.打开看门狗定时器*/WDT.WTCON = WDT.WTCON | (1 5);void main(void)wdt_init();interrupt_init();while(1)3编程实现 1s 内不对看门狗实现喂狗操作,
24、看门狗会自动复位。答:#include exynos_4412.hvoid main(void)unsigned int i = 0;/*1.设置一级预分频值 = 100000000 / (249 + 1) = 400000HZ*/WDT.WTCON = WDT.WTCON | (249 8);/*2.设置二级预分频值 = 400000 / 128 = 3125HZ*/WDT.WTCON = WDT.WTCON | (0x3 3);/*3.使能看门狗定时器能够产生复位信号*/WDT.WTCON = WDT.WTCON | 1;/*4.给递减计数器赋初值 喂狗*/WDT.WTCNT = 3125
25、;/*5.打开看门狗定时器*/WDT.WTCON = WDT.WTCON | (1 5);while(1)/*1s 内不对看门狗实现喂狗操作,看门狗会自动复位*/第十章1编程实现 RTC 的定时中断功能。答:#include exynos_4412.h/* 中断处理函数 */void do_irq()int irq_num;/* 读中断号 */irq_num = CPU0.ICCIAR & (0x3ff 0);/* 判断是哪个中断发生了 */switch (irq_num)case 77: /1S定时时间到/* 清中断 */RTCINTP = RTCINTP | 0x1;ICDICPR.ICD
26、ICPR2 = ICDICPR.ICDICPR2 | (0x1 13);printf(The RTC-TIC INT!n);break;default:break;/* 把当前发生的中断的中断号写回到EOIR寄存器,表示对当前中断已经处理完成,可以响应下一个中断 */CPU0.ICCEOIR = CPU0.ICCEOIR & (0x3ff 0) | irq_num;void interrupt_init()/*GIC*/* 1. 打开77号中断在GIC中对应的开关 */ICDISER.ICDISER2 = ICDISER.ICDISER2 | (0x1 13);/* 2. 把77号中断分发给C
27、PU0来处理 */ICDIPTR.ICDIPTR19 = ICDIPTR.ICDIPTR19 & (0xff 8) | (0x1 8);/* 3. 打开分发使能的总开关,让75号中断能到达CPU接口 */ICDDCR = ICDDCR | (0x1 0);/* 4. 打开CPU接口到达所连接的处理器的总开关 */CPU0.ICCICR = CPU0.ICCICR | (0x1 0);/* 5. 设置优先级的门限,为了让所有中断都通过,把优先级设最低(值最大) */CPU0.ICCPMR = CPU0.ICCPMR & (0xff 0) | (0xff 0);int main()interrup
28、t_init();RTCCON |= 0x1 8;TICCNT = 32768;while (1)return 0;2编程实现 RTC 定时器系统定时器功能。#include exynos_4412.h/* 中断处理函数 */void do_irq()int irq_num;/* 读中断号 */irq_num = CPU0.ICCIAR & (0x3ff 0);/* 判断是哪个中断发生了 */switch (irq_num)case 76: /定时时间到/* 清中断 */RTCINTP = RTCINTP | 0x2;ICDICPR.ICDICPR2 = ICDICPR.ICDICPR2 |
29、(0x1 12);printf(The RTC-timer INT!n);break;default:break;/* 把当前发生的中断的中断号写回到EOIR寄存器,表示对当前中断已经处理完成,可以响应下一个中断 */CPU0.ICCEOIR = CPU0.ICCEOIR & (0x3ff 0) | irq_num;void interrupt_init()/*GIC*/* 1. 打开76号中断在GIC中对应的开关 */ICDISER.ICDISER2 = ICDISER.ICDISER2 | (0x1 12);/* 2. 把76号中断分发给CPU0来处理 */ICDIPTR.ICDIPTR1
30、9 = ICDIPTR.ICDIPTR19 & (0xff 0) | (0x1 0);/* 3. 打开分发使能的总开关,让75号中断能到达CPU接口 */ICDDCR = ICDDCR | (0x1 0);/* 4. 打开CPU接口到达所连接的处理器的总开关 */CPU0.ICCICR = CPU0.ICCICR | (0x1 0);/* 5. 设置优先级的门限,为了让所有中断都通过,把优先级设最低(值最大) */CPU0.ICCPMR = CPU0.ICCPMR & (0xff 0) | (0xff 0);void RTC_init()RTCCON = 0x1;/ 使能RTC控制RTC.BC
31、DSEC = 0x11;RTC.BCDMIN = 0x19;RTC.BCDHOUR = 0x16;RTC.BCDDAY = 0x23;RTC.BCDWEEK = 0x04;RTC.BCDMON = 0x02;RTC.BCDYEAR = 0x17;RTCCON = 0x0;/ 禁止RTC控制void rtc_alarm_init()/设置xx:xx:20产生一次闹钟RTCALM.ALM = 1;RTCALM.SEC = 0x20;RTCALM.ALM |= 16;/ 使能闹钟int main()int old_sec;RTC_init();interrupt_init();rtc_alarm_i
32、nit();old_sec = RTC.BCDSEC;while (1)if (old_sec != RTC.BCDSEC)printf(20%x-%x-%x 星期:%xn, RTC.BCDYEAR, RTC.BCDMON, RTC.BCDDAY, RTC.BCDWEEK);printf(%x:%x:%xn, RTC.BCDHOUR, RTC.BCDMIN, RTC.BCDSEC);old_sec = RTC.BCDSEC;return 0;第十一章1 A/D 转换器选型时需要考虑哪些指标?答:分辨率、转换速率、量化误差、偏移误差、满刻度误差、线性度等。2 根据 A/D 的基本原理,可以将 A
33、/D 控制器分为哪些种类?答:积分型A/D转换器、逐次逼近性A/D、并行比较/串行比较A/D、电容阵列逐次比较型、压频变换型。3 在 PCLK为50MHz 的情况,如何设置Exynos4412的 A/D 控制器来实现采集速度为 100Ksps?答:ADCCON = ADCCON & (0xff 6) | (99 6);4编程实现采集一个范围在 03.3V 的电压的测试程序。答:因为该处理器能够测量电压的范围为0-1.8V,所以这里可以使用两个相同的电阻对测量电压进行分压,然后测量两个电阻的中间节点的电压,即0-1.65V,将测量出来的电压,在程序中乘以2就是实际测量的电压,程序如下:#incl
34、ude exynos_4412.h#include uart.h/编写延时函数void Delay_Ms(unsigned int ms)unsigned int i,j;for (i = 0;i ms;i+)for(j = 0;j 2500;j+);/初始化ADCvoid ADC_Init(void)/设置ADC通道为AIN3ADCMUX = ADCMUX & (0xf) | 0x3;/设置ADC分辨率12位ADCCON |= 1 16;/使能预分频器ADCCON |= 1 14;/设置预分频值, A/D转换时钟频率 = PCLK / (N + 1)ADCCON = ADCCON & (0x
35、ff 6) | (99 6);/设置ADC位工作模式ADCCON &= (1 2);/设置A/D开始转化的触发方式ADCCON &= (1 1);/读取模拟电压值unsigned int Read_AD_Value(void)unsigned int AD_value;/开启AD转换ADCCON |= 0x1;/判断AD转换是否结束while(!(ADCCON & (1 15);/读取AD转换后的结果AD_value = ADCDAT & 0xfff;/将AD值转换成实际的电压值 : Voltage(Mv) = AD_value * 1800 / 4096 AD_value = AD_valu
36、e * 0.44;return AD_value;void main()uart_init();ADC_Init();while(1)unsigned int Valtage_Value;/获取电压值Valtage_Value = Read_AD_Value() * 2;printf(Valtage = %dMvn,Valtage_Value);Delay_Ms(1000);第十二章1 请解释一下I2C总线的时序图。答:主机发送起始信号启用总线主机发送一字节数据指明从机地址与下一字节传送方向对应的从机应答发送器发送一字节数据接收方应答 数据传送完成后,主机发送停止信号释放总线使用权2 根据 M
37、PU6050 芯片手册,编写实现连续读时序和连续写时序。答:略3请讲讲 I2C 总线的特点和缺点。答:特点:布线简单:一条串行数据线 SDA、一条串行时钟线 SCL。每个连接到总线的器件都可以通过唯一的地址。真正的多主机总线,支持冲突检测和仲裁,防止数据被破坏。串行的 8 位双向数据传输位。速率在标准模式下可达 100Kbit/s、快速模式下可达 400Kbit/s、高速模式下可达 3.4Mbit/s。片上的滤波器可以滤去总线数据线上的毛刺波保证数据完整。连接到相同总线的 IC 数量只受到总线的最大电容 400pF 限制。缺点:半双工、传输速度低第十三章1 SPI总线和I2C 总线的区别是什么
38、?答:从名称上:SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS:意为IC之间总线)从硬件连接上:SPI总线是四线制(MISO,MOSI,CLK,CS)如果主机和从机是一对一的可以省略CS片选线IIC总线是两线制(SDA,CLK)从通信方式上:I2C是半双工,SPI是全双工从传输速度上:SPI的传输速度(8Mbit/s)高于IIC的传输速度(最快3.4Mbit/s)2 编写 MCP2515 配置为回环模式,实现数据的自发自收程序。spi.c文件:#include exynos_4412.h#include uart.hvoid
39、do_irq()/编写延时函数void Delay_Ms(unsigned int ms)unsigned int i,j;for(i = 0;i ms;i+)for(j = 0;j 2100;j+);/初始化GPIO控制器为SPI功能/初始化SPI控制器void SPI_Init()/1.设置GPC1引脚为SPI功能模式GPC1.CON = (GPC1.CON & (0xffff0) | 0x55550;/2.配置SPI时钟/6.0x6: 0x0110 = SCLKMPLL_USER_T 800MCLK_SRC_PERIL1 = (CLK_SRC_PERIL1 & (0xf 24) | 0x
40、6 24;CLK_DIV_PERIL2 = 19 8 | 3; /SPI_CLK = 800 / (19 + 1) / (3 + 1)/3.软件复位4412的SPI控制器Software_Reset();/4.设置控制寄存器CF_CFG 设置为:主模式,极性CPOL=0,相位CPOA=0,接收/发送使能位禁止SPI2.CH_CFG &= (0x1 4) | (0x1 3) | (0x1 1) | (0x3 0);/5.设置模式配置寄存器MODE_CFGSPI2.MODE_CFG &= (0x3 17) | (0x3 29);/6.选择手动选择芯片SPI2.CS_REG &= (0x1 1);D
41、elay(10);void main()unsigned char data = 0;/初始化串口uart_init();SPI_Init();printf(n#SPI TEST!#n);while(1)Reset_MCP2515();Delay_Ms(10);Bit_Modify_MCP2515(0x0f,0xe0,0x40);Mcp2515.c文件:#include exynos_4412.h/延时函数void Delay(unsigned int time)unsigned int i,j;for(i = 0;i time;i+)for(j = 0;j 1000;j+);/* * 片选从机 */void Slave_Enable(void)SPI2.CS_REG &= (0x1 0);/Delay(3);/* * 取消片选从机 */void Slave_Disable(void)SPI2.CS_REG |= 0x1;/Delay(2);/*