打印

有谁碰到这种情况,片选一直为低!

[复制链接]
1568|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jlgcumt|  楼主 | 2012-9-17 11:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
阿南| | 2012-9-17 11:53 | 只看该作者
你的片选3接的是存储器吗?能否确定它已经正常工作?

使用特权

评论回复
板凳
jlgcumt|  楼主 | 2012-9-17 20:01 | 只看该作者
本帖最后由 jlgcumt 于 2012-9-18 20:27 编辑

2#
问题补充:修改SMC寄存qi的读写时序不起作用!

使用特权

评论回复
地板
jlgcumt|  楼主 | 2012-9-17 22:08 | 只看该作者
2# 阿南 南哥用过SJA1000没?

使用特权

评论回复
5
jlgcumt|  楼主 | 2012-9-18 18:06 | 只看该作者
继续提问,今天发现问题没解决。

使用特权

评论回复
6
盈鹏飞科技| | 2012-9-18 18:09 | 只看该作者
这个问题还真细节!恐怕只有做过的,遇到过问题的,才能帮你解释。

使用特权

评论回复
7
盈鹏飞科技| | 2012-9-18 18:10 | 只看该作者
SJA1000,就是用IO模拟时续,没有更好的办法。

使用特权

评论回复
8
盈鹏飞科技| | 2012-9-18 18:10 | 只看该作者
SJA1000和NAND接法基本一致。

使用特权

评论回复
9
jlgcumt|  楼主 | 2012-9-18 21:43 | 只看该作者
貌似俺的配置是正确的,俺是裸奔,没带操作系统!,就是不工作,郁闷!
俺的配置也跟下面这个差不多
AT91C_BASE_EBI->EBI_CSA |= AT91C_EBI_CS4A_SMC;
AT91C_BASE_SMC2->SMC2_CSR[4] = 一个值


下面转一个别人的帖子!

在做一个ARM9-AT91RM9200挂CAN-SJA1000芯片的linux驱动时,出现以下问题:
把实地址通过ioremap映射到内核虚拟地址以后,对CAN的测试寄存器进行读写
的时候,出现不稳定的状况,写数进去,然后再读出来,这样写读26万多次,总会出现
一些读出来的数与写进去的不一致的现象,有时候多到几百次不一致,有时候
少,大概就几次。大家帮忙分析一下可能是什么原因导致的?谢谢了。

linux内核版本:linux-2.4.19 CPU:AT91RM9200
启动过程如下:9200-boot -> u-boot-1.1.4 -> linux-2.4.19
CAN芯片的片选初始化在 9200-boot 中进行,初始化过程如下:
void AT91F_Initcs4cs5()
{
//* Setup MEMC to support CS4=smc
AT91C_BASE_EBI->EBI_CSA |= AT91C_EBI_CS4A_SMC;


//* Setup Flash
AT91C_BASE_SMC2->SMC2_CSR[4] = (AT91C_SMC2_NWS & 0x7f) | AT91C_SMC2_WSEN
| (AT91C_SMC2_TDF & 0x300) | AT91C_SMC2_BAT | AT91C_SMC2_DBW_8;
AT91C_BASE_SMC2->SMC2_CSR[5] = (AT91C_SMC2_NWS & 0x7f) | AT91C_SMC2_WSEN
| (AT91C_SMC2_TDF & 0x300) | AT91C_SMC2_BAT | AT91C_SMC2_DBW_8;
}
在u-boot中定义 CONFIG_SKIP_LOWLEVEL_INIT 这样boot中的cpu初始化配置就不会被改写了。

有一个现象必须提一下,我在 9200-boot中用如下代码测试则写读都正确,测试多少次都不会
出现不一致的现象。
============9200-boot的can测试代码 开始=================
#define CAN0 (volatile char*)0x50040000
volatile char *BASEADD;

void setcanport(unsigned int reg, unsigned char data1)
{
BASEADD = CAN0;
*(BASEADD+8)=reg;
*(BASEADD)=data1;
}
unsigned char getcanport(unsigned char reg)
{       
unsigned char temp;
BASEADD = CAN0;
*(BASEADD+8)=reg;
temp=*BASEADD;
return (temp);
}
//寄存器读写测试
int RWtest(unsigned char chanal)
{
unsigned char        temp = 0;
int i,j,readErr = 0, readOk = 0;

for(i=0; i < 10240; i++)
{
for(j=0;j<256;j++)
{
setcanport(9,j);
temp = getcanport(9);
if(temp != j)
readOk += 1;
else
readErr += 1;

}

}
return readErr;
}
============9200-boot的can测试代码 结束=================

============linux下的can驱动 开始=================
#define CAN_SYS_HWADDR_BASE 0x50040000
static void *can_sys_v_addr;         //map can phy_addr to linux_addr

static void setcanport(unsigned char reg, unsigned char data)
{
writeb(reg,can_sys_v_addr+0x8);//模拟ALE锁存地址,发地址信号; CAN的ale信号线接A3脚
writeb(data,can_sys_v_addr); //发送数据到地址
}

static unsigned char getcanport(unsigned char reg)
{
unsigned char temp = 0;
writeb(reg,can_sys_v_addr+0x8); //模拟ALE锁存地址,发地址信号;
temp=readb(can_sys_v_addr); //从指定地址读取数据
return (temp);
}

/******************************************************************
* 函 数 名: rw_test       
* 功 能: can芯片寄存器读写测试       
* 入口参数: unsigned char chanal //can端口选择       
*******************************************************************/
static int rw_test()
{
unsigned char        temp = 0xBB;
int i,j,readErr = 0, readOk=0;

for(j=0; j < 1024; j++ )
{
for(i=0; i < 256; i++)
{
setcanport(9,i);
temp = getcanport(9);

if( temp!= i)
{
readErr += 1;
}
else
{
readOk +=1;
}
}
}
printk("========[Test end.] readErr = %d readOk = %d======\n", readErr, readOk);

return num;
}

/*--linux设备文件结构定义---*/
static struct file_operations can_fops = {
// owner: THIS_MODULE,
read : read_can,
write: write_can,
ioctl:         ioctl_can,
open :         open_can,
release: release_can,

};

#ifdef CONFIG_DEVFS_FS
static devfs_handle_t devfs_can_dir, devfs_can_ram;
#endif

static int __init test_can_init(void)
{
int result;
int i = 0;
struct resource *res;

AT91F_PIOB_CfgPMC();

result=register_chrdev(0,DEVICE_NAME,&can_fops); //注册一个设备,得到驱动的主设备号,动态

if(result<0)
{
printk("cannot get can major number\n"); //没有成功
return result;
}

canMajor = result;

printk("CAN are successful registed major:%d\n", canMajor);

#ifdef CONFIG_DEVFS_FS
devfs_can_dir = devfs_mk_dir(NULL, "can_b", NULL);
devfs_can_ram = devfs_register(devfs_can_dir, DEV_FILE_NAME , DEVFS_FL_DEFAULT,
canMajor, CAN_MINOR ,
S_IFCHR | S_IRUSR | S_IWUSR, &can_fops, NULL);
#endif

res = request_mem_region(CAN_SYS_HWADDR_BASE, 0x10, "can_b");
if(res == NULL)
{
printk("<1>request_mem_region:can_b failed!\n");
return -1;
}
can_sys_v_addr = ioremap(CAN_SYS_HWADDR_BASE,0x10);//映射物理地址到IO内存,可以让软件直接访问IO内存
if(can_sys_v_addr == NULL)
{
printk("<1>ioremap:can_b failed!\n");
return -1;
}
}

#ifdef DEBUG_PRINT
printk(DEVICE_NAME "initialized\n");
#endif

return 0;

}

static void __exit test_can_exit(void)
{
unsigned int i = 0;

#ifdef CONFIG_DEVFS_FS
devfs_unregister(devfs_can_ram);
devfs_unregister(devfs_can_dir);
#endif

iounmap(can_sys_v_addr);
release_mem_region(CAN_SYS_HWADDR_BASE, 0x10);

unregister_chrdev(canMajor,DEVICE_NAME);

}

/*--linux 模块驱动注册函数---*/
module_init(test_can_init);
module_exit(test_can_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("dddd");
MODULE_DESCRIPTION("CAN driver for at91rm9200");
============linux下的can驱动 结束=================

使用特权

评论回复
10
jlgcumt|  楼主 | 2012-9-19 19:23 | 只看该作者
哪位大侠帮帮忙呀,程序在开发板上运行没问题!

使用特权

评论回复
11
阿南| | 2012-9-20 09:53 | 只看该作者
SJA1000,10几年前在学样里用51控制过。

使用特权

评论回复
12
jlgcumt|  楼主 | 2012-9-21 08:50 | 只看该作者
问题已经找到,是nWEIT被拉低导致的!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:善攻者,动于九天之上,善守者,藏于九地之下!

183

主题

733

帖子

4

粉丝