搜索
bottom↓
回复: 9

基于KL25例程SPI通讯收发不等长的问题

[复制链接]

出0入0汤圆

发表于 2015-3-10 17:39:41 | 显示全部楼层 |阅读模式
基于KL系列SPI主机模式和外设通讯,采用PE生成的工程底层库,遇到个问题,期待解答。

参考KL25的SPI通讯例程,主从收发的字符数量都是相同的,如果收发不等长如何处理?
    例如,发送1Byte命令,要收5Byte数据,且是连续的,如下图。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2015-3-10 20:24:40 | 显示全部楼层
spi是中断还是查询?

出0入0汤圆

发表于 2015-3-11 08:46:48 | 显示全部楼层
其实我不太明白你的意思,但是采用中断的方式应该是可以的,
因为在K60的SPI的demo中,工作机理如你的帖子所示,发个命令给外围的Flash芯片,然后芯片返回数据给MCU .

出0入0汤圆

发表于 2015-3-11 08:54:05 | 显示全部楼层
应该是可以的啊 读取的时候 发送地址后 后面就应该是返回的数据 多读几次就行

出0入0汤圆

 楼主| 发表于 2015-3-11 09:31:08 | 显示全部楼层
答以上各位,中断模式,调用CW中PE生成的代码,完全参考help的代码,如下。
例程是收发同数据量的buffer。

#define BLOCK_SIZE 4

uint8_t OutData[BLOCK_SIZE] = "0123";
uint8_t InpData[BLOCK_SIZE];
volatile bool DataReceivedFlag = FALSE;
volatile LDD_SPIMASTER_TError ComError = 0U;
LDD_TError Error;
LDD_TDeviceData *MySPIPtr;

void main(void)
{
  ...
  MySPIPtr = SM1_Init(NULL);                               /* Initialization of SM1 component */
  Error = SM1_ReceiveBlock(MySPIPtr, InpData, BLOCK_SIZE); /* Request data block reception */
  Error = SM1_SendBlock(MySPIPtr, OutData, BLOCK_SIZE);    /* Start transmission/reception */
  while (!DataReceivedFlag) {};                            /* Wait until data block is transmitted/received */
}

如果按照发1byte收4byte,应该改为:
  Error = SM1_ReceiveBlock(MySPIPtr, InpData, 5); /* Request data block reception */
  Error = SM1_SendBlock(MySPIPtr, OutData, 1);    /* Start transmission/reception */

实际在示波器里看,收发的波形都正确,但是 Indata 里首字节会添加一个0xFF并丢失最后一个字节。
这么问题来了,0xFF怎么来的?如何避免?


出0入0汤圆

发表于 2015-3-11 09:36:19 | 显示全部楼层
对这些模块也不熟, 比如数据位数调整.
记得有个ADC是12bit数据,然后就设置不好了,用软件解决的.

出0入0汤圆

发表于 2015-3-11 11:02:52 | 显示全部楼层
lcptw 发表于 2015-3-11 09:31
答以上各位,中断模式,调用CW中PE生成的代码,完全参考help的代码,如下。
例程是收发同数据量的buffer。
...

效果是这样的,我以前也是用K60调试外部flash芯片也有这个现象,
这一个读取的数值是无效的,当时是这么分析的,我可能有点记不清啊,
当你发送命令时,其实接收端是有数据进入到SPI 接收端的,只是这是个无效数据,因为MISO一直保持高电平的。
所以导致你收到的第一个数据会是0xFF.

出0入0汤圆

 楼主| 发表于 2015-3-12 17:23:06 | 显示全部楼层
FSL_TICS_ZP 发表于 2015-3-11 11:02
效果是这样的,我以前也是用K60调试外部flash芯片也有这个现象,
这一个读取的数值是无效的,当时是这么 ...

就这点,让人生不如死,欲仙欲死;每当你以为高潮已过之时,它悄然来到。
最后尝试一次,用网上的驱动库试试看。
不行就换mcu方案。

出0入0汤圆

发表于 2015-3-13 08:21:41 | 显示全部楼层
lcptw 发表于 2015-3-12 17:23
就这点,让人生不如死,欲仙欲死;每当你以为高潮已过之时,它悄然来到。
最后尝试一次,用网上的驱动库 ...

建议楼主可以通过软件方式处理,丢掉第一个无效数据就可以啊。

出0入0汤圆

 楼主| 发表于 2015-3-13 09:50:19 | 显示全部楼层
呵呵,PE生成的中断方式代码。

每次丢掉首byte,在轮询测试情况下,偶尔会失常一把,第一个字符又正常了,然后中断就死在等最后一个字符那里了。

现在改用寄存器操作polling等待的方式,GPIO操作片选NCS(原因?自行参考《【经验分享】KL系列spi主从通信之查询中断例程》,内有详细说明,本坛资源)。

现在算是清楚了,为啥大家很不愿待见PE自动生成的代码,虽然有便于移植,上手快速等诸多优点。
最重要的是:
1、代码复杂,冗余量大,各种宏定义、指针跳转,用寄存器操作就不两条指令的,PE会生成一箩筐。
2、出了问题你都不知道在哪里找原因。

以前还推荐用PE,现在及可预见的将来是不会推荐了,各种坑。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-17 23:50

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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