wenliangxc 发表于 2014-11-7 17:09:03

MSP430149 SPI速度问题

这几天用430 spi 模块驱动SD卡实验,SPI在低速情况下,读取数据是正常的,在数据手册查到F149 SPI最大速度是4MHZ,但是在实际情况中只能达到1MHz,速度在高一点读到数据就出错了,一直找不到其中原因,恳请有经验有坛友指教!

sky_walker 发表于 2014-11-7 17:16:22

关注,用的是串口的设置?

wenliangxc 发表于 2014-11-7 19:26:09

sky_walker 发表于 2014-11-7 17:16
关注,用的是串口的设置?

SPI设置参照ti官方例程

wenliangxc 发表于 2014-11-10 10:07:12

sky_walker 发表于 2014-11-7 17:16
关注,用的是串口的设置?

找到问题了,这是原来的程序
void SPI_Write_Byte(unsigned char byte)
{
IFG2 &= 0xCF;
U1TXBUF = byte;
while(!(IFG2 & UTXIFG1));
}

unsigned char SPI_Read_Byte(void)
{
IFG2 &= 0xCF;
U1TXBUF = 0xFF;
while(!(IFG2 & URXIFG1));                                //判断URXIFG1为接收完成标志
return U1RXBUF;
}
这是改过后程序
void SPI_Write_Byte(unsigned char byte)
{
IFG2 &= 0xCF;
U1TXBUF = byte;
while(!(IFG2 & UTXIFG1));
}

unsigned char SPI_Read_Byte(void)
{
IFG2 &= 0xCF;
U1TXBUF = 0xFF;
while(!(IFG2 & UTXIFG1));                                //判断UTXIFG1为接收完成标志
return U1RXBUF;
}
两个程序不同之处就是接收字节完成判断的标志位,造成SPI速度上不去,两个程序各有优缺点,以前我采用的是第二程序,但是存在一个问题就是SPI接收的第一个字节是错误的,永远是0xFF,所以我用判断URXIFG1来确认接收是否完成,但是又出现了另一个问题,在实际中如果接收字节是0xFF,URXIFG1是不置位的,程序会一直死在那里

sky_walker 发表于 2014-11-12 18:54:48

官方也是这么配置的?

sky_walker 发表于 2014-11-12 19:27:23

        while (!(IFG2 & UCB0TXIFG))                                // USCI_B0 TX buffer ready?
        {
        }
        UCB0TXBUF = *pbuf;                                     // Previous data to TX, RX

        while(UCB0STAT & UCBUSY)
        {
        }

        temp = UCB0RXBUF;

wenliangxc 发表于 2014-11-12 22:27:56

sky_walker 发表于 2014-11-12 19:27
while (!(IFG2 & UCB0TXIFG))                                // USCI_B0 TX buffer ready?
        {
        }


好的,回去试下,对了还要咨询你一下,spi寄存器里里有个CKPH和CKPL两个标志位设置,一直没搞清楚什么时候需要设置,而且不同spi速率下对数据是有影响的

gwichenjin 发表于 2014-11-18 11:49:23

1M基本上小应用都可以了吧
页: [1]
查看完整版本: MSP430149 SPI速度问题