搜索

[技术问答] HC32F030库函数spi发送数据问题请教

[复制链接]
495|6
 楼主 | 2020-4-1 14:55 | 显示全部楼层 |阅读模式
本帖最后由 tottionly 于 2020-4-1 17:01 编辑
  1. en_result_t Spi_SendData(en_spi_channel_t enCh,uint8_t u8Data)
  2. {
  3.     uint32_t u32TimeOut;
  4.     ASSERT(IS_VALID_CH(enCh));
  5.     u32TimeOut = 0xffff;
  6.     if(Spi0 == enCh)
  7.     {
  8.         while(--u32TimeOut)
  9.         {
  10.             if(TRUE == M0P_SPI0->STAT_f.TXE)
  11.             {
  12.                 break;
  13.             }
  14.         }
  15.                
  16.         if(u32TimeOut == 0)
  17.         {
  18.             return ErrorTimeout;
  19.         }
  20.                 M0P_SPI0->DATA = u8Data;
  21.         u32TimeOut = 0xffff;
  22.         while(--u32TimeOut)
  23.         {
  24.             if(TRUE == M0P_SPI0->STAT_f.RXNE)
  25.             {
  26.                 break;
  27.             }
  28.         }
  29.         if(u32TimeOut == 0)
  30.         {
  31.             return ErrorTimeout;
  32.         }
  33.                 u8Data = M0P_SPI0->DATA;
  34.         
  35.     }
  36.     else
  37.     {
  38.         while(--u32TimeOut)
  39.         {
  40.             if(TRUE == M0P_SPI1->STAT_f.TXE)

  41.             {
  42.                 break;
  43.             }
  44.         }
  45.         if(u32TimeOut == 0)
  46.         {
  47.             return ErrorTimeout;
  48.         }
  49.         M0P_SPI1->DATA = u8Data;
  50.         u32TimeOut = 0xffff;
  51.         while(--u32TimeOut)
  52.         {
  53.             if(TRUE == M0P_SPI1->STAT_f.RXNE)
  54.             {
  55.                 break;
  56.             }
  57.         }
  58.         if(u32TimeOut == 0)
  59.         {
  60.             return ErrorTimeout;
  61.         }
  62.         u8Data = M0P_SPI1->DATA;
  63.     }
  64.     return Ok;
  65. }
复制代码

这是华大HC32F030的库函数。
请教下:
1. 这里发送一个字节,为什么要判断RXNE?
2. 为什么最后对u8Data赋值?这不是形参吗?

使用特权

评论回复
| 2020-4-1 15:43 | 显示全部楼层
没用过你这个芯片,但是我猜测 RXNE 是该芯片的 SPI 寄存器的接收标志,因为SPI在发送一个字节的同时也收到了一个字节,如果 RXNE 为TRUE则表明发送成功;
给 u8Data 赋值看起来没有具体作用。

使用特权

评论回复
| 2020-4-1 21:05 | 显示全部楼层
1. SPI是同步传输发送成时也是接收完成时,没有专门增加发送完成的标志,所以通过读取RXNE标志以确认发送完成 。
2. 未设置清除RXNE的控制寄存器,通过读取DATA来实现清除RXNE标志。
670295e8491ac6dc2e.png

使用特权

评论回复
| 2020-4-1 21:30 | 显示全部楼层
902445e84976b83c91.png

使用特权

评论回复
 楼主 | 2020-4-2 10:14 | 显示全部楼层
smartpower 发表于 2020-4-1 21:05
1. SPI是同步传输发送成时也是接收完成时,没有专门增加发送完成的标志,所以通过读取RXNE标志以确认发送完 ...

感谢解答。

另外再请教下:
  1. uint8_t Spi_ReceiveData(en_spi_channel_t enCh,boolean_t bMasterOrSlave)
  2. {
  3.     uint8_t temp;
  4.     ASSERT(IS_VALID_CH(enCh));
  5.     if(Spi0 == enCh)
  6.     {
  7.         if(1 == bMasterOrSlave)
  8.         {
  9.           M0P_SPI0->DATA = 0x00;
  10.         }
  11.         while(0 == M0P_SPI0->STAT_f.RXNE){;}
  12.         temp = M0P_SPI0->DATA;
  13.     }
  14.     else
  15.     {
  16.         if(1 == bMasterOrSlave)
  17.         {
  18.             M0P_SPI1->DATA = 0x00;
  19.         }
  20.         while(0 == M0P_SPI1->STAT_f.RXNE){;}
  21.         temp = M0P_SPI1->DATA;
  22.     }  
  23.     return temp;
  24. }
复制代码


接收的函数中bMasterOrSlave==1 应该是表示是主机的意思,为什么主机接收需要进行M0P_SPI0->DATA = 0x00 操作?

另外,在HC32L136的LITE版本库函数中,发送和接收都很简单。
  1. en_result_t Spi_SendData(M0P_SPI_TypeDef* SPIx, uint8_t u8Data)
  2. {  
  3.     SPIx->DATA = u8Data;
  4.    
  5.     return Ok;
  6. }


  7. uint8_t Spi_ReceiveData(M0P_SPI_TypeDef* SPIx)
  8. {
  9.     return SPIx->DATA;
  10. }
复制代码


使用特权

评论回复
| 2020-4-2 11:22 | 显示全部楼层
tottionly 发表于 2020-4-2 10:14
感谢解答。

另外再请教下:

作为主机时,写一个字节到BUF,触发主机发出SCK.有SCK从机才能返回数据。

使用特权

评论回复
| 2020-4-4 15:07 | 显示全部楼层
SPI 通信时, 发送一个字节数据的同时你会收到一个无用字节数据,   当你读一个字节数据的同时会发送一个无用字节数据

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表