最近需要使用到S12的EBI接口,想想很简单的东西折腾了一下午+小半个晚上,呵呵,也不怕丢人,小记一下:
S12下NX模式下外部总线有效,手上的板子在复位时通过外部引脚选择进入NS模式,随后设置MODE
(MODE = 0b10100000)使机器进入 NX模式(可以通过外部管脚,使上电直接进入该模式)。
设定外部空间范围0x208000~20E000
初始化EBI:
void EBIInit(void)
{
EBICTL0 = 0b10110000; // 16 bits address & 16 bits data width
EBICTL1 = 0x02; // 3 extra cycles
MMCCTL0 = 0x02; // enable cs1
}
定义外部空间基地址:
#define PEX_BASE ((volatile unsigned short * far) (0x208000))
这里定义 far指针是必须的,它向编译器指明需要扩展的空间,编译器会在对其操作时自动添加对GPAGE的操作,当写入*PEX_BASE = 0;后,对应的汇编如下:
CLRB
CLRA
MOVB #32,/*GPAGE*/16
GSTD 32768
OK, 后面可以对外部空间进行直接操作了
====================================================
S12的地址空间定义比较复杂,现在都还有些一知半解,寻址模式有local 和 global两种,个人理解,在NX模式下,所有地址定义在local范围内,当采用NS模式后,需要进行地址映射,对于CPU使用的FLASH需要根据使用情况通过MMCCTL1进行map,在global地址下,寻址需要xpage+addr, xpage:EPAGE\RPAGE\PPAGE等,具体还没有使用到这么多的情况。
motorolla的东西总是太追求高性能,导致东西有点儿变态,16位机搞成这样(btw:竟然集成了5个can口),价格飙得老高,不过用了一阵子,各种电磁试验中,稳定性上到是没出过什么问题,确实也难得。
文章评论(0条评论)
登录后参与讨论