楼主: grace-425826

[已解决] kineitic ezport问题(看过了AN4406)(已解决)

[复制链接]

该用户从未签到

25

主题

104

帖子

0

中级会员

Rank: 3Rank: 3

积分
302
最后登录
1970-1-1
 楼主| 发表于 2013-8-13 16:57:01 | 显示全部楼层

回复:kineitic ezport问题(看过了AN4406)

非常感谢版主!确实忘了更改管脚了。(顺便友情提示使用此测试模块的朋友,若要改到K60模板上,还需更改hal_config.h头文件中的宏定义:#define BOARD BOARD_K60)现在能够测到正确的时钟了。但是还是从EZPORT输出端读不到正确的数据,读出来都是0XFF,用的测试函数是
 test_read_sr();
  show_ftfl_reg();
那请问,EZPORT的指令测试要注意顺序吗?就是能够开始就读状态寄存器再读FLASH内容吗?
回复第 10 楼 于2013-08-13 11:30:11发表:
 所给的代码是用在TWR-K40X256板子上的,之前我做过测试,是可以通过TWR-K40X256板子连接其他Kinetis芯片的。
如果要用在TWR-K60N512板子上,需要更改对应的SPI管脚。之所以选用TWR-K40X256板子是因为板子上提供了SPI端口跳线。
 
关于硬件连接的问题,我同意你的观点,应该用主出从入,主入从出,程序中的接口需要对调一下。
 
关于SPI波特率的问题,例程中中,SPI的参考时钟bus clock为24MHz,默认SPI0_CTAR0[PBR] 为2分频, 则SPI 波特率为 24/(2*64).
代码中注释有问题,应该是12M/64 = 187.5Kbps 
波特率在EzPort编程中并非严格要求的,EzPort端口应该是通过clock线来获得同步信号的。
 
硬件连接我把1进行了对调,然后是host SPI连接slave的EZPORT,只对host 的SPI进行编程,slave只上电,没有进行任何编程处理。
这样的连接是正确的。目标芯片是不需要事先编程的。
 
祝顺利。
 
回复 支持 反对

使用道具 举报

该用户从未签到

35

主题

508

帖子

0

金牌会员

Rank: 6Rank: 6

积分
2167
最后登录
1970-1-1
发表于 2013-8-14 10:43:57 | 显示全部楼层

回复:kineitic ezport问题(看过了AN4406)

 如果你用的是TWR-K60N512板子做的测试,需要注意R72电阻是没有放置的,这回造成目标芯片不能进入EzPort模式。
schematics.jpg
例程是测试过的,可以读出EzPort状态寄存器的值。
祝顺利。
回复 支持 反对

使用道具 举报

该用户从未签到

25

主题

104

帖子

0

中级会员

Rank: 3Rank: 3

积分
302
最后登录
1970-1-1
 楼主| 发表于 2013-8-14 11:48:57 | 显示全部楼层

回复:kineitic ezport问题(看过了AN4406)

 哦哦,我用的不是TWR,检查了下我的CS脚,是连上的,就是读出不对啊,EZP_DO接口测到的电平是0,但是有扰动,SPI_IN接口测到的是高电平,有扰动,读到的结果自然就一直是0xff了...
另外想到,ezport接口所在K60FLASH是烧过程序的,难道有影响么?
回复第 12 楼 于2013-08-14 10:43:57发表:
 如果你用的是TWR-K60N512板子做的测试,需要注意R72电阻是没有放置的,这回造成目标芯片不能进入EzPort模式。

例程是测试过的,可以读出EzPort状态寄存器的值。
祝顺利。
 
回复 支持 反对

使用道具 举报

该用户从未签到

35

主题

508

帖子

0

金牌会员

Rank: 6Rank: 6

积分
2167
最后登录
1970-1-1
发表于 2013-8-14 13:15:03 | 显示全部楼层

回复:kineitic ezport问题(看过了AN4406)

烧过代码是不会影响EzPort模式的,不过首先要确保目标板的K60芯片能正常进入EzPort模式。
注意一下上电顺序,应该是EzPort测试板先上电,之后再让目标板上电,确保目标板EzPort_CS线为低电平,能够正常进入EzPort模式。
 
回复第 13 楼 于2013-08-14 11:48:57发表:
 哦哦,我用的不是TWR,检查了下我的CS脚,是连上的,就是读出不对啊,EZP_DO接口测到的电平是0,但是有扰动,SPI_IN接口测到的是高电平,有扰动,读到的结果自然就一直是0xff了...
另外想到,ezport接口所在K60FLASH是烧过程序的,难道有影响么?
回复第 12 楼 于2013-08-14 10:43:57发表:
 如果你用的是TWR-K60N512板子做的测试,需要注意R72电阻是没有放置的,这回造成目标芯片不能进入EzPort模式。

例程是测试过的,可以读出EzPort状态寄存器的值。
祝顺利。
 

 
回复 支持 反对

使用道具 举报

该用户从未签到

25

主题

104

帖子

0

中级会员

Rank: 3Rank: 3

积分
302
最后登录
1970-1-1
 楼主| 发表于 2013-8-15 16:10:57 | 显示全部楼层

回复:kineitic ezport问题(看过了AN4406)

哦哦,好的,谢谢!我试过了,还是这样...哎哎,我再研究研究...
回复第 14 楼 于2013-08-14 13:15:03发表:
烧过代码是不会影响EzPort模式的,不过首先要确保目标板的K60芯片能正常进入EzPort模式。
注意一下上电顺序,应该是EzPort测试板先上电,之后再让目标板上电,确保目标板EzPort_CS线为低电平,能够正常进入EzPort模式。
 
 
 

 

 
回复 支持 反对

使用道具 举报

该用户从未签到

85

主题

790

帖子

0

金牌会员

Rank: 6Rank: 6

积分
2279
最后登录
1970-1-1
发表于 2013-8-20 11:20:17 | 显示全部楼层

RE:kineitic ezport问题(看过了AN4406)

好的,有什么后续问题,欢迎提出。
回复 支持 反对

使用道具 举报

该用户从未签到

25

主题

104

帖子

0

中级会员

Rank: 3Rank: 3

积分
302
最后登录
1970-1-1
 楼主| 发表于 2013-8-20 21:01:27 | 显示全部楼层

回复:kineitic ezport问题(看过了AN4406)

谢谢!今天重新试了下,重新下载的MAHUI版主给的demo,这次是对的了。对比了下之前的程序发现芯片型号还有core都没有选择正确,不知道当时怎么下载成功的了...
另外还有一个问题,我自己写的还是没有调通,和demo最大的区别是SPI接收和发送函数,demo只用了一个hal_spi_transfer_one_byte完成发送和接收,这样发送函数里面的PUSHER寄存器的CONT位貌似就在控制PCS信号了,而我是两个不同函数,这样接收的时候就没有用pusher控制的CONT位控制片选信号,不知道可以单独不?
附函数:
void spi_send_onebyte(uint8 spiNo,uint8 data,uint8 end)//发送
{
 
    SPI_MemMapPtr BaseAdd = spi_get_base_address(spiNo);
    
    SPI_SR_REG(BaseAdd) = (SPI_SR_EOQF_MASK
         | SPI_SR_TFUF_MASK
         | SPI_SR_TFFF_MASK
         | SPI_SR_RFOF_MASK
         | SPI_SR_RFDF_MASK)
      ;//ÖÃλ¸÷±ê־λ
    SPI_MCR_REG(BaseAdd) |= SPI_MCR_CLR_TXF_MASK 
              | SPI_MCR_CLR_RXF_MASK  
              ;//Çå³ýRX,TX FIFO¶ÓÁмÆÊýÆ÷       
    if(end)//ĩβ×Ö·û
      {
             SPI_PUSHR_REG(BaseAdd) = 0 
                               | SPI_PUSHR_CTAS(0)
                               | SPI_PUSHR_EOQ_MASK//×îºóÒ»¸öÊý¾Ý
                               | SPI_PUSHR_PCS(1)
                               | SPI_PUSHR_TXDATA(data);
      }
    else
      {
                SPI_PUSHR_REG(BaseAdd) = 0 | SPI_PUSHR_CONT_MASK //ƬѡÐźÅʼÖÕʹÄÜ
                               | SPI_PUSHR_CTAS(0)//CTAR0Ñ¡Ôñ
                               | SPI_PUSHR_PCS(1)//ÖÃλƬѡÐźţºPCS0=1
                               | SPI_PUSHR_TXDATA(data);//·¢ËÍÊý¾Ýdata
      }  
}

uint8 spi_re(uint8 spiNo)//接收
{
            uint8 data;
      SPI_MemMapPtr BaseAdd = spi_get_base_address(spiNo);
      while(!(SPI_SR_REG(BaseAdd) & SPI_SR_RFDF_MASK));//½ÓÊÕRXFIFOÊÇ·ñΪ¿Õ
            data= (uint8)SPI_POPR_REG(BaseAdd);  
 
      SPI_SR_REG(BaseAdd) = (SPI_SR_EOQF_MASK
               | SPI_SR_TFUF_MASK
               | SPI_SR_TFFF_MASK
               | SPI_SR_RFOF_MASK
               | SPI_SR_RFDF_MASK);
 
      SPI_MCR_REG(BaseAdd) |= SPI_MCR_CLR_TXF_MASK     //Clear the Tx FIFO counter.
                | SPI_MCR_CLR_RXF_MASK;     //Clear the Rx FIFO counter.
            return(data);       
}

回复第 16 楼 于2013-08-20 11:20:17发表:
好的,有什么后续问题,欢迎提出。
 

 
回复 支持 反对

使用道具 举报

该用户从未签到

35

主题

508

帖子

0

金牌会员

Rank: 6Rank: 6

积分
2167
最后登录
1970-1-1
发表于 2013-8-21 10:29:04 | 显示全部楼层

回复:kineitic ezport问题(看过了AN4406)

回复第 17 楼 于2013-08-20 21:01:27发表:
谢谢!今天重新试了下,重新下载的MAHUI版主给的demo,这次是对的了。对比了下之前的程序发现芯片型号还有core都没有选择正确,不知道当时怎么下载成功的了...
另外还有一个问题,我自己写的还是没有调通,和demo最大的区别是SPI接收和发送函数,demo只用了一个hal_spi_transfer_one_byte完成发送和接收,这样发送函数里面的PUSHER寄存器的CONT位貌似就在控制PCS信号了,而我是两个不同函数,这样接收的时候就没有用pusher控制的CONT位控制片选信号,不知道可以单独不?
附函数:
 
void spi_send_onebyte(uint8 spiNo,uint8 data,uint8 end)//发送
{
 
    SPI_MemMapPtr BaseAdd = spi_get_base_address(spiNo);
    
    SPI_SR_REG(BaseAdd) = (SPI_SR_EOQF_MASK
         | SPI_SR_TFUF_MASK
         | SPI_SR_TFFF_MASK
         | SPI_SR_RFOF_MASK
         | SPI_SR_RFDF_MASK)
      ;//ÖÃλ¸÷±ê־λ
    SPI_MCR_REG(BaseAdd) |= SPI_MCR_CLR_TXF_MASK 
              | SPI_MCR_CLR_RXF_MASK  
              ;//Çå³ýRX,TX FIFO¶ÓÁмÆÊýÆ÷       
    if(end)//ĩβ×Ö·û
      {
             SPI_PUSHR_REG(BaseAdd) = 0 
                               | SPI_PUSHR_CTAS(0)
                               | SPI_PUSHR_EOQ_MASK//×îºóÒ»¸öÊý¾Ý
                               | SPI_PUSHR_PCS(1)
                               | SPI_PUSHR_TXDATA(data);
      }
    else
      {
                SPI_PUSHR_REG(BaseAdd) = 0 | SPI_PUSHR_CONT_MASK //ƬѡÐźÅʼÖÕʹÄÜ
                               | SPI_PUSHR_CTAS(0)//CTAR0Ñ¡Ôñ
                               | SPI_PUSHR_PCS(1)//ÖÃλƬѡÐźţºPCS0=1
                               | SPI_PUSHR_TXDATA(data);//·¢ËÍÊý¾Ýdata
      }  
}
 
 
uint8 spi_re(uint8 spiNo)//接收
{
            uint8 data;
      SPI_MemMapPtr BaseAdd = spi_get_base_address(spiNo);
      while(!(SPI_SR_REG(BaseAdd) & SPI_SR_RFDF_MASK));//½ÓÊÕRXFIFOÊÇ·ñΪ¿Õ
            data= (uint8)SPI_POPR_REG(BaseAdd);  
 
      SPI_SR_REG(BaseAdd) = (SPI_SR_EOQF_MASK
               | SPI_SR_TFUF_MASK
               | SPI_SR_TFFF_MASK
               | SPI_SR_RFOF_MASK
               | SPI_SR_RFDF_MASK);
 
      SPI_MCR_REG(BaseAdd) |= SPI_MCR_CLR_TXF_MASK     //Clear the Tx FIFO counter.
                | SPI_MCR_CLR_RXF_MASK;     //Clear the Rx FIFO counter.
            return(data);       
}
 
回复第 16 楼 于2013-08-20 11:20:17发表:
好的,有什么后续问题,欢迎提出。
 

SPI的接收同样需要master 发出一个空的数据,否则slave是无法把数据发给master的。
另外SPI的收发是同时进行的。
这样看来用一个传输的函数就可以实现SPI收发的功能。
SPI_PUSHR [CONT]位用以控制SPI通信过程中片选线是否一直保持有效。
 
回复 支持 反对

使用道具 举报

该用户从未签到

25

主题

104

帖子

0

中级会员

Rank: 3Rank: 3

积分
302
最后登录
1970-1-1
 楼主| 发表于 2013-8-22 11:13:48 | 显示全部楼层

回复:kineitic ezport问题(看过了AN4406)

谢谢MAHUI版主,可是我在我的接收函数之前加了一个发空以后还是不对,而且我好像看到在EZPORT命令里面RDSR是不需要发空数据的,所以能再请教你一下,我的程序跟demo的还一个区别是使能了FIFO,所以我接收查询的标志位是FIFO的RFDF,而不是demo里面的传输结束标志TXF,请问可能是FIFO的问题吗?但是我测到的EZP-TDO脚确实一直为低电平。
回复第 18 楼 于2013-08-21 10:29:04发表:
回复第 17 楼 于2013-08-20 21:01:27发表:SPI的接收同样需要master 发出一个空的数据,否则slave是无法把数据发给master的。
另外SPI的收发是同时进行的。
这样看来用一个传输的函数就可以实现SPI收发的功能。
SPI_PUSHR [CONT]位用以控制SPI通信过程中片选线是否一直保持有效。
 

 
回复 支持 反对

使用道具 举报

该用户从未签到

35

主题

508

帖子

0

金牌会员

Rank: 6Rank: 6

积分
2167
最后登录
1970-1-1
发表于 2013-8-26 16:06:50 | 显示全部楼层

回复:kineitic ezport问题(看过了AN4406)

回复第 19 楼 于2013-08-22 11:13:48发表:
谢谢MAHUI版主,可是我在我的接收函数之前加了一个发空以后还是不对,而且我好像看到在EZPORT命令里面RDSR是不需要发空数据的,所以能再请教你一下,我的程序跟demo的还一个区别是使能了FIFO,所以我接收查询的标志位是FIFO的RFDF,而不是demo里面的传输结束标志TXF,请问可能是FIFO的问题吗?但是我测到的EZP-TDO脚确实一直为低电平。
回复第 18 楼 于2013-08-21 10:29:04发表:
回复第 17 楼 于2013-08-20 21:01:27发表:SPI的接收同样需要master 发出一个空的数据,否则slave是无法把数据发给master的。
另外SPI的收发是同时进行的。
这样看来用一个传输的函数就可以实现SPI收发的功能。
SPI_PUSHR [CONT]位用以控制SPI通信过程中片选线是否一直保持有效。
 

 

 

你可以看到我之前所附例程中读状态寄存器例程:
byte get_sr(void)
{
    byte v;
    hal_spi_transfe_start();
    hal_spi_transfer_one_byte(CMD_GET_SR,false);
    v = hal_spi_transfer_one_byte(0x00,true);
    hal_spi_transfe_stop();
    return v;
}
    v = hal_spi_transfer_one_byte(0x00,true); 这句代码就是dummy 写操作,是为了读出状态寄存器的值。
 
使用FIFO应该是没有问题的,你要查看寄存器配置是否存在什么配置问题。
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2025-7-23 04:56 , Processed in 0.102540 second(s), 30 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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