12
返回列表 发新帖
楼主: zhangsaisai0814

[分享] KL25 中断模式下SPI主从通信不能进入中断

[复制链接]

该用户从未签到

20

主题

58

帖子

0

中级会员

Rank: 3Rank: 3

积分
350
最后登录
2015-10-22
发表于 2015-8-12 11:04:01 | 显示全部楼层
楼主你的主函数里改为
SPI0=SM_SPI0_Init(NULL);
回复 支持 反对

使用道具 举报

该用户从未签到

13

主题

62

帖子

0

中级会员

Rank: 3Rank: 3

积分
238
最后登录
1970-1-1
 楼主| 发表于 2015-8-12 11:18:04 | 显示全部楼层
pyheben 发表于 2015-8-12 11:04
楼主你的主函数里改为
SPI0=SM_SPI0_Init(NULL);

啊,这样改?我刚刚试过了,还是不能进入中断。
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-8-12 14:42:15 | 显示全部楼层
zhangsaisai0814 发表于 2015-8-12 11:18
啊,这样改?我刚刚试过了,还是不能进入中断。

你模块怎么配置的呢?
你参考KL25的官方例程配置,那个是可以进入中断的。
回复 支持 反对

使用道具 举报

该用户从未签到

13

主题

62

帖子

0

中级会员

Rank: 3Rank: 3

积分
238
最后登录
1970-1-1
 楼主| 发表于 2015-8-12 15:58:21 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2015-8-12 14:42
你模块怎么配置的呢?
你参考KL25的官方例程配置,那个是可以进入中断的。 ...

您好,我是完全按照KL25官方例程上的PE模块进行配置的,除了从机的引脚设置不一样。只是官方例程里面是在一块开发板上实现SPI0做主机,SPI1做从机。官方例程的主程序如下: SPI_example.png
我现在是把官方例程上在一块开发板上的程序分成主、从,并运行在两块开发板上。
是不是把例程里面从机的接收发送和主机的接收发送语句分开来,对应主机、从机的程序,就可以了。
我是这样做的,但进不去中断。
回复 支持 反对

使用道具 举报

该用户从未签到

13

主题

62

帖子

0

中级会员

Rank: 3Rank: 3

积分
238
最后登录
1970-1-1
 楼主| 发表于 2015-8-12 16:29:58 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2015-8-12 14:42
你模块怎么配置的呢?
你参考KL25的官方例程配置,那个是可以进入中断的。 ...

主机和从机的电源和地是连接在一起的。如果我先给主机上电,然后再从机进入debug状态,是不是主机在从机运行之前已经运行过了,所以有可能会导致从机收不到主机发过来的数据
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-8-13 09:43:51 | 显示全部楼层
zhangsaisai0814 发表于 2015-8-12 16:29
主机和从机的电源和地是连接在一起的。如果我先给主机上电,然后再从机进入debug状态,是不是主机在从机 ...

那是肯定的,如果你主机要接收数据,那么你从机要先上电,把buff给填上,这样主机发数据的时候,主机才能接收到数据。
你参考官方代码,你event.c里面程序加了没有?
回复 支持 反对

使用道具 举报

该用户从未签到

13

主题

62

帖子

0

中级会员

Rank: 3Rank: 3

积分
238
最后登录
1970-1-1
 楼主| 发表于 2015-9-8 15:30:29 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2015-8-13 09:43
那是肯定的,如果你主机要接收数据,那么你从机要先上电,把buff给填上,这样主机发数据的时候,主机才能 ...

你好,我现在在看SPI的PE例程。现在有些不太明白。 SPI_DEMO.png
(1)83行的/* Slave sends dummy message and waits for receiving some message from master*/

这里为什么slave要发送dummy message给主机?
(2)在96,97里面Master发完数据以后,为什么在104,105 Master sends dummy message?
(3)现在这个程序是在一块开发板上,SPI0做主机,SPI1做从机。如果我想把它改成在两块开发板上,一个做主机,一个做从机,程序应该怎么修改呢?
直接把SM和SS的相关收发函数放在对应的主从机上,就可以了吗?例如,现在的代码里面
/* Slave sends dummy message and waits for receiving some message from master*/
  strcpy(slave_send,"Message_dummy");  
  SS1_SendBlock(SS1_DeviceData, slave_send, DATA_SIZE);
  SS1_ReceiveBlock(SS1_DeviceData, slave_receive, DATA_SIZE);

  for(;;){

  /* Master sends message 1  */
  printf("\n\nMaster: Sending message1...\n");   
  strcpy(master_send,"Send_Message1");  
  SM1_SendBlock(SM1_DeviceData, master_send, DATA_SIZE);   
  SM1_ReceiveBlock(SM1_DeviceData, master_receive, DATA_SIZE);


这两段代码的执行有没有先后顺序?
如果我把
/* Slave sends dummy message and waits for receiving some message from master*/
  strcpy(slave_send,"Message_dummy");  
  SS1_SendBlock(SS1_DeviceData, slave_send, DATA_SIZE);
  SS1_ReceiveBlock(SS1_DeviceData, slave_receive, DATA_SIZE);

放在从机上。

  /* Master sends message 1  */
  printf("\n\nMaster: Sending message1...\n");   
  strcpy(master_send,"Send_Message1");  
  SM1_SendBlock(SM1_DeviceData, master_send, DATA_SIZE);   
  SM1_ReceiveBlock(SM1_DeviceData, master_receive, DATA_SIZE);

放在主机上,就可以了吗?

回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2015-9-10 12:09:00 | 显示全部楼层
zhangsaisai0814 发表于 2015-9-8 15:30
你好,我现在在看SPI的PE例程。现在有些不太明白。
(1)83行的/* Slave sends dummy message and waits  ...

回答你几个问题:
1.从机先发,是先把从机的buff给填上。
  因为你知道,SPI是同步发的,一边发,一边接,如果你直接主机发,从机不填数据,就导致从机的数据buff是0XFF,这样,主机发出去的同时,接到的就是0XFF。
2.这个就是两次不同数据的发送,你也可以定义自己想发送的数据
3.可以直接把主机部分移植到主机,从机部分移植到从机。
就是上电的时候,从机先上电,把buff先填满,然后再上电主机。
回复 支持 反对

使用道具 举报

该用户从未签到

13

主题

62

帖子

0

中级会员

Rank: 3Rank: 3

积分
238
最后登录
1970-1-1
 楼主| 发表于 2015-9-10 21:35:12 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2015-9-10 12:09
回答你几个问题:
1.从机先发,是先把从机的buff给填上。
  因为你知道,SPI是同步发的,一边发,一边接 ...

好的,我大概明白了。
SS1_SendBlock(SS1_DeviceData, slave_send, DATA_SIZE);是先把从机的buff填满,等主机发送数据过来时,
从机此时会把buff里面的数据发给主机是吧?

我现在还有一个问题:我写了一段小程序,代码如下:
for(;;){
SS1_ReceiveBlock(slaveDevData, (LDD_TData*)buffSlave, sizeof(buffSlave));
SM1_SendBlock(masterDevData, (LDD_TData*)msgMaster, sizeof(msgMaster) );
while (SS1_GetBlockReceivedStatus(slaveDevData) == FALSE) ;
}
这三个语句可以实现主机发数据,从机不断收数据。
如果我把主机和从机分离,从机不断的在采集传感器数据,而主机每隔100ms来通过SPI读取一下从机的数据。SPI能不能实现以下功能:从机平时在正常采集传感器数据,而主机隔100ms会执行一次
SM1_SendBlock来发送一个命令,来开启读取从机的数据。
从机能不能进入SPI接收中断,在中断中发送传感器数据给主机?
我自己测试了一下,好像从机需要在主函数中不断的执行SS1_ReceiveBlock函数,才能进入SPI接收中断。
是不是说从机需要不断执行SS1_ReceiveBlock才能进入接收中断?
有点乱,不知道有没有表述清楚
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-22 20:31 , Processed in 0.099000 second(s), 27 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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