STM32F407 SPI的几个注意事项

1、STM32F407的SPI1的波特率最高,但也只能到37.5Mbits/s。和SPI从设备交互时,不能只看从设备的SPI能力,得按主从设备的低限确定系统的整体波特率;

2、SPI+DMA时,发送和接收都会很快,从波形看,字节间几乎没有明显的间隔。但在读取从设备的地址空间时,从设备往往需要一定的时间准备数据,如果主设备读取太快,从设备的数据准备时间不足,会导致读取错误。此时,可不使用DMA,而是采用阻塞式或中断式SPI收发函数。经测试HAL_SPI_TransmitRecieve()会在字节间有约0.8us的空档;HAL_SPI_Transmit()会快些,间隔大约0.1us;

3、SPI+DMA的另一个问题就是:CPU调用DMA函数后并不会等待数据传输完成,而是直接运行后续程序,这就给拉高片选(NSS)以及得到的数据做后续处理带来问题,比如SPI还未传输完就拉高了NSS,或者还没完全读出数据就拿来做判断处理。于是为了解决这些问题,还得用定时器做中断拉高NSS及开始后续处理等,反而麻烦。而不使用DMA,采用阻塞式或中断式SPI收发函数则可避免这一问题;

3、SPI从设备往往需要主设备在通信的开头几个字节里写入命令和地址,如果需要往一个地址开始写入大量数据,且需要根据情况从不同的数组中取数,那就可以采用”先发字头再发数据“的方法(而且使用Transmit函数比较快):

void Write_Data(uint32_t Addr, uint8_t* pBuf, uint16_t len)
{
	HAL_GPIO_WritePin(W5100S_SCS_GPIO_Port, W5100S_SCS_Pin, GPIO_PIN_RESET); //turn W5100S SCS Low
	write_cmd[0]=0xF0;
	write_cmd[1]=(Addr & 0xFF00) >>  8;
	write_cmd[2]=(Addr & 0x00FF) >>  0;	
	HAL_SPI_Transmit(&hspi1,write_cmd,3,1);

	HAL_SPI_Transmit(&hspi1,pBuf,len,1);

	HAL_GPIO_WritePin(W5100S_SCS_GPIO_Port, W5100S_SCS_Pin, GPIO_PIN_SET);
}

4、”先发字头再发数据“的方法不适用于用TransmitReceive()函数从从设备读取大量数据,貌似是两次收发间隔太长,或者TransmitReceive()函数问题?读取数据时只能用TransmitReceive()函数,用Receive()在两线式主设备下,还时会被转为TransmitReceive()函数;

 

5、使用TransmitReceive()函读取数据的量比较大时,可直接在接收区头部写入”字头“,将接收和发送区地址都设为该接收区,从而避免使用其他的发送地址而导致访问越界!(调试过程中,接收256字节后总是卡住,估计有可能是用了一个10字节的数组作为发送字头的地址,导致TransmitReceive()函读访问越界)

void Read_Data(uint32_t Addr, uint8_t* pBuf, uint16_t len)
{
	HAL_GPIO_WritePin(W5100S_SCS_GPIO_Port, W5100S_SCS_Pin, GPIO_PIN_RESET); //turn W5100S SCS Low
	pBuf[0]=0x0F;
	pBuf[1]=(Addr & 0xFF00) >>  8;
	pBuf[2]=(Addr & 0x00FF) >>  0;	
	HAL_SPI_TransmitReceive(&hspi1,pBuf,pBuf,(len+3),2);
	HAL_GPIO_WritePin(W5100S_SCS_GPIO_Port, W5100S_SCS_Pin, GPIO_PIN_SET);
}

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32F407的时钟系统是非常复杂和强大的,它包含了多个时钟源和不同的时钟分频器,可以用来驱动各种外设和处理器核。下面是一个简要的概述: 1. 外部晶体/振荡器:STM32F407可以使用外部晶体或振荡器作为系统时钟源。这些外部时钟源可以提供更高的精度和稳定性。 2. 内部时钟源:STM32F407还集成了内部RC振荡器(HSI)和内部低速RC振荡器(LSI)。这些时钟源可以在没有外部晶体或振荡器的情况下使用。 3. PLL锁相环:PLL是STM32F407中一个重要的模块,可以将输入时钟源的频率倍增,从而得到更高的系统时钟频率。通过配置PLL的分频器和倍频器,可以实现不同的系统时钟频率。 4. AHB总线时钟(HCLK):AHB总线时钟用于驱动CPU、DMA控制器和高速外设,可以通过设置分频系数来调整其频率。 5. APB总线时钟(PCLK1和PCLK2):APB总线时钟用于驱动低速外设,包括UART、SPI、I2C等。它们也可以通过设置分频系数来调整其频率。 在配置时钟系统时,需要注意以下几点: 1. 选择合适的时钟源:根据应用需求和性能要求,选择适合的外部晶体/振荡器或内部时钟源。 2. 配置PLL:根据目标系统时钟频率,配置PLL的分频器和倍频器,确保得到准确的系统时钟频率。 3. 配置AHB和APB分频器:根据外设的要求和系统性能要求,配置适当的分频系数,确保AHB和APB总线时钟在合理范围内。 4. 时钟安全守卫(CSS):在一些应用场景中,可以使用时钟安全守卫功能来检测外部时钟源故障,并采取相应措施。 这只是对STM32F407时钟系统的简要介绍,实际的配置过程还涉及到其他细节和注意事项。对于更详细的信息,建议参考STM32F407的参考手册和时钟树配置工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值