打印

SPI读写操作问题

[复制链接]
936|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiahy|  楼主 | 2019-2-23 09:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
自己设计的电路是通过f5529的spi接口控制一个前端的AFE芯片

我画的电路连接方式是用UCB1的3线SPI口(P4.1~P4.3),而P4.0作为前端的片选CS(低有效)

现在遇到的问题是 模拟前端的芯片给出了例如初始化,读写寄存器,复位等的通用代码  并给了一个Communication.c的接口程序用于不同的控制器来控制

在这个C文件中定义了SPI_Init () , SPI_Write () , SPI_Read ()  三个函数

初始化函数我觉得自己写的应该没有问题  而读写函数不太会写

相关帖子

沙发
jiahy|  楼主 | 2019-2-23 10:12 | 只看该作者

unsigned char SPI_Write(unsigned char* data,
                                                unsigned char bytesNumber)
{
    unsigned char byte = 0;
    P4OUT &= ~BIT0;                               // 将CS置低开始传输
   
      for(byte = 0; byte < bytesNumber; byte++)
      {
        while (!(UCB1IFG&UCTXIFG));               // USCI_B1 TX buffer ready?
        UCB1TXBUF = data[byte];                    // Transmit first character           
      }
   
    P4OUT |= BIT0;                               // 将CS置高完成传输
      
        return bytesNumber;
}


这个是我的写的代码  总觉得哪里不对  在编译debug的时候 似乎在循环执行某句话(我也不知道为啥我的IAR debug的时候看不到绿色的箭头指示)

使用特权

评论回复
板凳
zhenykun| | 2019-2-23 10:16 | 只看该作者
什么意思?不是很明白你说的什么,能再解释一下这个现象吗

使用特权

评论回复
地板
jiahy|  楼主 | 2019-2-23 10:21 | 只看该作者

附上我的读的代码  读的代码……肯定不对  我在学习spi的时候 理解到的SPI传输方式应该是在写的后半个时钟周期就会自动读……
但是到了自己写代码的时候就模模糊糊不知道怎么判断。

使用特权

评论回复
5
jiahy|  楼主 | 2019-2-23 10:26 | 只看该作者
unsigned char SPI_Read(unsigned char* data,
                                           unsigned char bytesNumber)
{
    unsigned char byte = 0;
    P4OUT &= ~BIT0;                               // 将CS置低开始传输
   
  for(byte = 0; byte < bytesNumber; byte++)
      {
        while (!(UCB1IFG&UCTXIFG));               // USCI_B1 RX buffer ready?
         data[byte] = UCB1RXBUF;                     // Transmit first character           
      }
  
    P4OUT |= BIT0;                               // 将CS置高完成传输
  
        return bytesNumber;
}

使用特权

评论回复
6
zhenykun| | 2019-2-23 10:33 | 只看该作者
按照你写的不用写中断函数

使用特权

评论回复
7
jlyuan| | 2019-2-23 10:41 | 只看该作者
unsigned char SPI_Read(unsigned char* data,
                                           unsigned char bytesNumber)
{
    unsigned char byte = 0;
    P4OUT &= ~BIT0;                               // 将CS置低开始传输
   
  for(byte = 0; byte < bytesNumber; byte++)
      {
        while (!(UCB1IFG&UCTXIFG));               // USCI_B1 RX buffer ready?
        UCB1TXBUF = 0x55;
        while (!(UCB1IFG&UCTXIFG));
        data[byte] = UCB1RXBUF;                     // Transmit first character           
      }
  
    P4OUT |= BIT0;                               // 将CS置高完成传输
  
        return bytesNumber;
}

使用特权

评论回复
8
jiahy|  楼主 | 2019-2-23 10:50 | 只看该作者
我的那个SPI_Write()代码是轮询方式么?还是中断方式,需不需要写中断向量函数

使用特权

评论回复
9
heweibig| | 2019-2-23 10:57 | 只看该作者
然后呢?你是怎么应对这个的呢

使用特权

评论回复
10
jiahy|  楼主 | 2019-2-23 11:00 | 只看该作者

话说试着调试一下还有问题
我的IAR在调试单个main()函数的时候  会有一个绿色的箭头指着到哪句了
这个工程中有好几个C文件 调试的时候没有箭头  看的比较乱

使用特权

评论回复
11
wuhany| | 2019-2-23 11:06 | 只看该作者
但不执行,走到哪一步箭头就在哪一步,遇到函数调用,可以进入函数内部执行

使用特权

评论回复
12
shimx| | 2019-2-23 11:10 | 只看该作者

也有箭头的,调试时耐心点

使用特权

评论回复
13
jiaxw| | 2019-2-23 11:13 | 只看该作者

SPI总线调试,注意总线两端的通讯速率的匹配的就可以拉

使用特权

评论回复
14
liliang9554| | 2019-2-23 11:22 | 只看该作者
然后呢?你是怎么应对这个的呢

使用特权

评论回复
15
jiahy|  楼主 | 2019-2-23 11:26 | 只看该作者
我用的F5529的芯片 看datasheet上说上电默认SMCLK=DCO=2.097152MHZ,FLL默认2分频,
我用
UCB1CTL1 |= UCSSEL_2;               // SMCLK=1048kHz
UCB1BR0 = 0;                               // 不分频
UCB1BR1 = 0;                              //
这样可行么?

使用特权

评论回复
16
huangchui| | 2019-2-23 11:29 | 只看该作者
还用不用再设置UCS?

使用特权

评论回复
17
jiahy|  楼主 | 2019-2-23 11:32 | 只看该作者
为什么老是看不到SCLK的波形,用示波器?

使用特权

评论回复
18
zhenykun| | 2019-2-23 11:36 | 只看该作者
包括用TI的官方示例时候 也看不到SCLK波形

使用特权

评论回复
19
jiahy|  楼主 | 2019-2-23 11:40 | 只看该作者
嗯,预料中的结果,先结贴吧,多谢大家啦

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

862

主题

9861

帖子

4

粉丝