OpenEdv-开源电子网

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

求大神指导fsmc通信问题!

[复制链接]

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2018-7-30
在线时间
42 小时
发表于 2018-10-23 17:05:17 | 显示全部楼层 |阅读模式
23金钱
本帖最后由 OblivioLcJzc 于 2018-10-23 19:29 编辑

两块32f103zet6开发板想用fsmc通信,一边是dma把16位的数组搬到fsmc总线上,另一边dma把fsmc总线上的数据搬到内存数组,但是主机发出的数据高8位全是1,低8位是正常的。从机接收的高8位全是0,低8位正常!而且数组数据顺序全乱了!求大神指导!以下是发送端DMA配置:
void MYDMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr,u32 dir)
{
         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);        //使能DMA传输
        
  DMA_DeInit(DMA_CHx);   //将DMA的通道1寄存器重设为缺省值

        DMA1_MEM_LEN=cndtr;
        DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;  //DMA外设基地址
        DMA_InitStructure.DMA_MemoryBaseAddr = cmar;  //DMA内存基地址
        DMA_InitStructure.DMA_DIR = dir ;  //数据传输方向,从内存读取发送到外设
        DMA_InitStructure.DMA_BufferSize = cndtr;  //DMA通道的DMA缓存的大小
        DMA_InitStructure.DMA_PeripheralInc =DMA_PeripheralInc_Disable;  //外设地址寄存器不变
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址寄存器递增
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_MemoryDataSize_HalfWord;  //数据宽度为16位
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //数据宽度为16位
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  //工作在正常缓存模式
        DMA_InitStructure.DMA_Priority = DMA_Priority_High ; //DMA通道 x拥有中优先级
        DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;  //DMA通道x没有设置为内存到内存传输
        DMA_Init(DMA_CHx, &DMA_InitStructure);  
}

fsmc我用的是原子TFTLCD实验程序,两块板子fsmc配置一样
readWriteTiming.FSMC_AddressSetupTime = 0x00;         //地址建立时间(ADDSET)为2个HCLK 1/36M=27ns
  readWriteTiming.FSMC_AddressHoldTime = 0x00;         //地址保持时间(ADDHLD)模式A未用到        
  readWriteTiming.FSMC_DataSetupTime = 0x0f;                 //

  readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
  readWriteTiming.FSMC_CLKDivision = 0x00;
  readWriteTiming.FSMC_DataLatency = 0x00;
  readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A;         //模式A

  writeTiming.FSMC_AddressSetupTime = 0x00;         //地址建立时间(ADDSET)为1个HCLK  
  writeTiming.FSMC_AddressHoldTime = 0x00;         //地址保持时间(A               
  writeTiming.FSMC_DataSetupTime = 0x03;                 ////数据保存时间为4个HCLK        
  writeTiming.FSMC_BusTurnAroundDuration = 0x00;
  writeTiming.FSMC_CLKDivision = 0x00;
  writeTiming.FSMC_DataLatency = 0x00;
  writeTiming.FSMC_AccessMode = FSMC_AccessMode_A;         //模式A

  FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;//  这里我们使用NE4 ,也就对应BTCR[6],[7]。
  FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; // 不复用数据地址
  FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM;  //SRAM   
  FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//存储器数据宽度为16bit   
  FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable;
  FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
  FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
  FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;   
  FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;  
  FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;        //  存储器写使能
  FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;   
  FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; // 读写使用不同的时序
  FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
  FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming; //读写时序
  FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &writeTiming;  //写时序

  FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  //初始化FSMC配置

  FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);  // 使能BANK1

主函数
  u16 SPI_TXBUFFER[6]={128,1000,500,600,700,1255};
  u16 SPI_RXBUFFER[6];
  #define LCD_BASE        ((u32)(0x6C000000 | 0x000007FE))
  #define LCD                 ((LCD_TypeDef *) LCD_BASE)

int main(void)
{        
        delay_init();                     //延时函数初始化         
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        uart_init(115200);                 //串口初始化为115200
         LED_Init();                             //LED端口初始化
        LCD_Init();//
        MYDMA_Config(DMA1_Channel3,(u32)LCD ,(u32)SPI_TXBUFFER,6,DMA_DIR_PeripheralDST);
     //   MYDMA_Config(DMA1_Channel3,(u32)LCD ,(u32)SPI_RXBUFFER,6,DMA_DIR_PeripheralSRC);接收dma,
        MYDMA_Enable(DMA1_Channel3);
       while(1);
}


最佳答案

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

我已解决问题,dma配置出错了!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2018-7-30
在线时间
42 小时
 楼主| 发表于 2018-10-23 17:05:18 | 显示全部楼层
我已解决问题,dma配置出错了!
回复

使用道具 举报

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2018-7-30
在线时间
42 小时
 楼主| 发表于 2018-10-23 19:30:33 | 显示全部楼层
@正点原子 原子哥,帮我看看怎么回事!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-10-24 02:07:55 | 显示全部楼层
没那么简单,先把你的DMA删了吧,直接传输看成不成先
回复

使用道具 举报

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2018-7-30
在线时间
42 小时
 楼主| 发表于 2018-10-24 08:39:38 | 显示全部楼层
本帖最后由 OblivioLcJzc 于 2018-10-24 08:48 编辑
正点原子 发表于 2018-10-24 02:07
没那么简单,先把你的DMA删了吧,直接传输看成不成先

我试了,直接传输可以,就是数据有的时候是错的,但一会又变回正确的了!错误和正确交替!是不是时序把握不对啊!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-10-26 02:23:41 | 显示全部楼层
OblivioLcJzc 发表于 2018-10-24 08:39
我试了,直接传输可以,就是数据有的时候是错的,但一会又变回正确的了!错误和正确交替!是不是时序把握 ...

继续调试下吧
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

10

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
362
金钱
362
注册时间
2018-5-14
在线时间
46 小时
发表于 2018-10-29 13:09:47 | 显示全部楼层
dma真sky好东西
行至水穷处 坐看云起时
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 05:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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