最近在使用28069的GPIO,发现连续操作相邻或相近的IO时总会不成功,GPIO的配置应该没问题,因为单步执行是没问题的,就是连续操作的时候不行。比如先把GPADAT0 =0;紧接着GPADAT1 =1;那么后面的这一次操作就是不成功的,不仅管家没有输出,连寄存器的值也不变。今天测试了一下在两个语句直接加6个NOP的时候才可以。有没有遇到类似问题的同学们啊,大家讨论一下!
回复 楼主jishuaihu 的帖子
这种问题我遇到过,凡是28X系列的DSP芯片的GPADAT都不能够连续操作,但是对于GPIOASET,GPIOCLEAR可以进行连续操作,所以说GPADAT主要是用来作为读取GPIO的电平的状态,而控制外接输出则最好使用其余的三个寄存器设置。
这是我在模拟I2C与单总线时遇到的教训。希望会对于楼主有所帮助。
可以在手册里看一下,GPIO口的最快变化频率,是否有达到主频的频率。
回复 楼主jishuaihu 的帖子
我的妈呀,来的都是斑竹级别的,受不了了。
If Read-Modify-Write operations are used on the GPxDAT registers, because of the delay between the output and the input of the first instruction (I1), the second instruction (I2) will read the old value and write it back.
GpioDataRegs.GPADAT.bit.GPIO1 = 1 ; I1 performs read-modify-write of GPADAT
GpioDataRegs.GPADAT.bit.GPIO2 = 1 ; I2 also a read-modify-write of GPADAT. ;It gets the oldvalue of GPIO1 due to the delay
The second instruction will wait for the first to finish its write due to the write-followed-by-read
protection on this peripheral frame. There will be some lag, however, between the write of (I1) and the GPxDAT bit reflecting the new value (1) on the pin. During this lag, the second instruction will read the old value of GPIO1 (0) and write it back along with the new value of GPIO2 (1). Therefore, GPIO1 pin stays low.
解决办法有两种。1.在两次赋值之间插入空语句nop;2.使用GPASET,GPACLEAR寄存器,进行引脚电平设置
回复 沙发liuming759 的帖子
谢谢!明天试一下!
3.18 Pipeline Conflict Detection
是C28的Pipeline 的原因,
Chapter 4 Pipeline
This chapter describes the phases and operation of the instruction pipeline.
The chapter is primarily for readers interested in increasing the efficiency of
their programs by preventing pipeline delays.
[
本帖最后由 dontium 于 2013-8-5 12:59 编辑 ]
谢楼主还有下面的回复啊!我刚刚开始学,也遇到了这个问题,原来是这样。。。