OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3310|回复: 5

FSMC与FPGA多地址通讯问题

[复制链接]

20

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2012-10-23
在线时间
9 小时
发表于 2015-9-6 23:28:08 | 显示全部楼层 |阅读模式
5金钱
100脚的STM32F207VCT6,使用8位FSMC与FPGA通讯,除了D0-D7、NOE、NWE、CS外还有三个地址线,三个地址线分别接在了FSMC的A20、A21、A22上,其他脚都接在了FSMC对应的信号上。
我把FPGA的地址定义成如下所示
//FPGA地址
#define   FPGA_ADDR0    (u32)(FSMC_BASE + (0L << 21))
#define   FPGA_ADDR1    (u32)(FSMC_BASE + (1L << 21))
#define   FPGA_ADDR2    (u32)(FSMC_BASE + (2L << 21))
#define   FPGA_ADDR3    (u32)(FSMC_BASE + (3L << 21))
#define   FPGA_ADDR4    (u32)(FSMC_BASE + (4L << 21))
#define   FPGA_ADDR5    (u32)(FSMC_BASE + (5L << 21))
#define   FPGA_ADDR6    (u32)(FSMC_BASE + (6L << 21))
#define   FPGA_ADDR7    (u32)(FSMC_BASE + (7L << 21))

现在要往不同的地址写数据,封装成一个函数,如下所示
void FPGA_Write_Byte(u32 Addr, u8 Data)
{
        Addr = Data;
}

调用时想往Addr写FPGA_ADDR0-7,这样感觉不对,但又想不出怎么写,还望大家指点一下。


最佳答案

查看完整内容[请看2#楼]

[mw_shl_code=c,true]void FPGA_Write_Byte(u32 Addr, u8 Data) { *(volatile u8 *)Addr = Data; }[/mw_shl_code]
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3722
金钱
3722
注册时间
2011-5-23
在线时间
2013 小时
发表于 2015-9-6 23:28:09 | 显示全部楼层
[mw_shl_code=c,true]void FPGA_Write_Byte(u32 Addr, u8 Data) { *(volatile u8 *)Addr = Data; }[/mw_shl_code]

RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

20

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2012-10-23
在线时间
9 小时
 楼主| 发表于 2015-9-7 14:04:44 | 显示全部楼层
这样强制转换会不会把地址的高位弄丢了,然后结果就不对了。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-9-7 20:51:12 | 显示全部楼层
回复【3楼】天才少年:
---------------------------------
你还需要加强下c基础
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

20

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2012-10-23
在线时间
9 小时
 楼主| 发表于 2015-9-9 10:50:36 | 显示全部楼层
我是硬件工程师,C语言并非强项,为了搞清楚这个东西,用Signaltap查看了一下结果,虽然对*(__IO uint8_t *)这种东西依旧没能完全理解,但也知道该怎么用了。

我把FSMC配置成8位的,给地址定义成*(__IO uint32_t *)时,向他写一个32位的数据实际上是连发4次,将32位的数据发出去,定义成*(__IO uint16_t *)时发两次,试过1楼的那个确实可以,如果把*(volatile u8 *)改成*(volatile u16 *)的话,写32位的数据他也是发两次,但是只有第一次是正确的,发的是最低8位,第二次就是0x00了。

测试如下








回复

使用道具 举报

20

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2012-10-23
在线时间
9 小时
 楼主| 发表于 2015-9-9 10:52:29 | 显示全部楼层
将*(volatile u8 *)改为*(volatile u16 *)

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 11:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表