[求助] LM3S的SPI,用SPI读写设置,读不到数据啊!

yuchenglin   2010-8-20 16:42 楼主

LM3S的SPI,用SPI读写TC72一直都不到数据,读时,在主模式下SCK有波形吗?设置如下。
    // Enables a peripheral SSI0
    SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);
    // Configures pin(s) for use by the SSI peripheral
    // PA2 SSI0CLK(SSCK)  PA4 SSI0RX(MISO) PA5 SSI0TX(MOSI)
    GPIOPinTypeSSI(GPIO_PORTA_BASE,(GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5));
    // PA2 SSI0CLK(SSCK)
    //GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_2);
    // PA4 SSI0RX(MISO)
    //GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_4); 
    // PA5 SSI0TX(MOSI)
    //GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5);

    // Disables the synchronous serial interface 
    SSIDisable(SSI0_BASE);

   // Configure the SSI, 1MHZ 
    SSIConfigSetExpClk(SSI0_BASE,   // Base 
                                    //SysCtlClockGet(),  // SSIClk
                                   20000000,            // 5MHZ
                                  SSI_FRF_MOTO_MODE_2, // Protocol
                                  SSI_MODE_MASTER,     // Mode
                                 1000000,             // BitRate 
                                  8 // DataWidth
         ); 
   // Enables the synchronous serial interface  
   SSIEnable(SSI0_BASE);
有用模块读写SPI EEPROM的吗? 

回复评论 (27)

你这问题,我手头上没有板子,我无法调试.你把spi的协议多看看,抓一下它的波形.分析波形是否符合spi的要求.
点赞  2010-8-21 09:23
谢谢了
点赞  2010-8-21 16:43

用SPI提供的函数,可以读到有SPI接口的芯片数据的。

一个为理想不懈前进的人,一个永不言败人! http://shop57496282.taobao.com/ 欢迎光临网上店铺!
点赞  2010-8-23 08:56
为什么我看不到25LC256 SO口上的数据,而且再读时SCK在上没有波形
点赞  2010-8-23 11:56
写时SCK、SDO的波形都正常
点赞  2010-8-23 11:57
你的电路呢?EEROM几伏供电的?主模式,SCK是M3提供出来的时钟信,必然有波形
点赞  2010-8-23 13:43
我就是SPI接了25LC256,接口都对啊。电路上传不了吧?SCK在写完后,就没有了。奇怪?可能是那里设置不对。
点赞  2010-8-23 14:07
25LC256是2.5-5.5V的啊!我SPI上还有一个TC72,3.3V的,也是读不到数据。
点赞  2010-8-23 14:11

回复 9楼 yuchenglin 的帖子

我的意思是说,M3的IO可以承受5V电压,但是它输出的电平,不是5V,你的EEROM,要求的高电平下限阈值是0.7VCC?

这个,SCK的波形,你先测M3出来的有问题没,再接你的EEROM,开始使用低速,调通了再提高……
点赞  2010-8-23 15:16
TI的8962开发板的OLED就是spi的,你看下例程……
点赞  2010-8-23 15:18
25LC256 VIH 0.7VCC , VOH  VCC -0.5,我现在用的是100K啊!M3定时器和IO口都能正常工作。取数据前需写一个0XFF吗?感觉是需要的,如:SSIDataPut(SSI0_BASE, 0xFF);
              SSIDataGet(SSI0_BASE, pulData++);但是还是没有数据。
点赞  2010-8-23 15:24

回复 12楼 yuchenglin 的帖子

需要些0XFF,你说的SCK没信号的一个原因,就是发送寄存器里没东西,你在线调试,单步,看SPI的寄存器有没有不对

[ 本帖最后由 mawenwei 于 2010-8-23 15:42 编辑 ]
点赞  2010-8-23 15:40
没有什么不对啊!奇怪
点赞  2010-8-23 22:14

引用: 原帖由 yuchenglin 于 2010-8-23 22:14 发表 没有什么不对啊!奇怪

 

嘿嘿,仔细检查,要有耐心,或者换个M3的板子来读读看

点赞  2010-8-24 09:04
这几个问题你看看:
第一:你的CS端是用的SSI的FSS吗?如果不是,这个会有可能影响你的数据发送。
怎么解释呢?咱们先看看函数给的发送函数是怎么编写的吧:
void
SSIDataPut(unsigned long ulBase, unsigned long ulData)
{
    ASSERT((ulBase == SSI0_BASE) || (ulBase == SSI1_BASE));
    ASSERT((ulData & (0xfffffffe << (HWREG(ulBase + SSI_O_CR0) &
                                     SSI_CR0_DSS_M))) == 0);// 这个不管
    while(!(HWREG(ulBase + SSI_O_SR) & SSI_SR_TNF))  //(重要)先等待缓冲区中的数据为空
    {
    }
    HWREG(ulBase + SSI_O_DR) = ulData;   //  再把数据发送出去!!!
}
这样的程序有可能发生这样的状况就是:你往外发送数据,用SSIDataPut函数,如果下一条指令是CS(无效),那么你的从芯片还没有接收到数据,你就把信号接收功能给断掉了。实际ARM还在发送信号,只是从芯片接收不到!!!
第二、接收函数之前进行了多少次发送。如果超过八次,则你的接收FIFO已经满了,SSIDataGet函数只是从FIFO中接收数据。你可以做个简单的测试,让你的RX和TX接在一起。然后用SSIDataPut发送8个字符,然后发送第九个字符的时候和前面八个不一样,你用SSIDataGet读取数据,只能读到前八个数据,第九个数据就丢失了。
如果这样还不行,我就没有太好的办法了。呵呵。
写的有些乱,自己领悟吧。
祝你早日调出来。
相信自己,相信未来
点赞  2010-8-25 19:34
引用: 原帖由 zfnuaa 于 2010-8-25 19:34 发表 这几个问题你看看: 第一:你的CS端是用的SSI的FSS吗?如果不是,这个会有可能影响你的数据发送。 怎么解释呢?咱们先看看函数给的发送函数是怎么编写的吧: void SSIDataPut(unsigned long ulBase, unsigned lo ...

我的SPI读没有问题,就是写数据的时候在这句进死循环了 while(!(HWREG(ulBase + SSI_O_SR) & SSI_SR_TNF)) //(重要)先等待缓冲区中的数据为空
点赞  2010-8-25 21:58
我没有办法用IO口模拟,实现了25LC256和TC72的读写,数据都正常。我只是读写4个字节数据,CS在读后才无效的。楼上读得是什么?
点赞  2010-8-26 12:41
但感觉IO口模拟很浪费资源
点赞  2010-8-26 12:42
我直接读有数据,但是不知道对不对
点赞  2010-8-26 14:30
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复