打印
[STM32L4]

STM32L433的SPI

[复制链接]
1487|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
SPI的初始化 zjz 11:05:09
/* SPI1 init function */
static void MX_SPI1_Init(void)
{

  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }

}


现象:SPI总线,通过示波器观察,发现数据位设为小于等于8时,sck脉冲数为其位数的两倍,大于9时,等于位数。哪位高手请指点一下!!
沙发
mypczhou|  楼主 | 2017-2-10 17:01 | 只看该作者
这是通过示波器看到的sck引脚的波形  数据位设置为8位

sck11.png (683.76 KB )

sck11.png

使用特权

评论回复
板凳
mypczhou|  楼主 | 2017-2-12 09:16 | 只看该作者
期待中……

使用特权

评论回复
地板
戈卫东| | 2017-2-12 09:25 | 只看该作者
可能是FIFO的问题。一次写入被识别为两个数据。。。。猜的。

使用特权

评论回复
5
mypczhou|  楼主 | 2017-2-12 10:16 | 只看该作者
戈卫东 发表于 2017-2-12 09:25
可能是FIFO的问题。一次写入被识别为两个数据。。。。猜的。

FIFO在SPI寄存器中没有配置的位,如果是FIFO的问题,那就是个BUG了吧……

使用特权

评论回复
6
mypczhou|  楼主 | 2017-2-12 10:17 | 只看该作者
戈卫东 发表于 2017-2-12 09:25
可能是FIFO的问题。一次写入被识别为两个数据。。。。猜的。

FIFO在SPI寄存器中没有配置的位,如果是FIFO的问题,那就是个BUG了吧……

使用特权

评论回复
7
戈卫东| | 2017-2-12 12:05 | 只看该作者
mypczhou 发表于 2017-2-12 10:17
FIFO在SPI寄存器中没有配置的位,如果是FIFO的问题,那就是个BUG了吧……

你用字节写,应该会识别成一个数据,如果用半字(16BIT)写,就识别成2个数据。

使用特权

评论回复
8
mypczhou|  楼主 | 2017-2-12 13:56 | 只看该作者
戈卫东 发表于 2017-2-12 12:05
你用字节写,应该会识别成一个数据,如果用半字(16BIT)写,就识别成2个数据。 ...

int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  delay(60000);
  MX_SPI1_Init();

  /* USER CODE BEGIN 2 */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
//  SX1212WriteConfig(0,0X10,1);
  while (1)
  {
  /* USER CODE END WHILE */
//  SX1212WriteConfig(0,0X10,1);
  SPI1->DR = 0x55;
  delay(20000);
  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

我是这么测试的,给DR直接写0x55  应该是一个字节吧

使用特权

评论回复
9
mypczhou|  楼主 | 2017-2-12 14:26 | 只看该作者
戈卫东 发表于 2017-2-12 12:05
你用字节写,应该会识别成一个数据,如果用半字(16BIT)写,就识别成2个数据。 ...

数据设为4位时,sck为8个脉冲,设为5位时sck为10个脉冲 设为9位时 sck为9个脉冲

使用特权

评论回复
10
戈卫东| | 2017-2-12 16:04 | 只看该作者
如果用寄存器,你需要这样写,否则FIFO自动把你的数据变成2个:
    *((U8 *)(&SPI1->DR)) = data;  

使用特权

评论回复
11
mypczhou|  楼主 | 2017-2-12 16:48 | 只看该作者
戈卫东 发表于 2017-2-12 16:04
如果用寄存器,你需要这样写,否则FIFO自动把你的数据变成2个:
    *((U8 *)(&SPI1->DR)) = data;  
...

嗯  试了试确实是这样。厉害!!!!谢谢!!!!

使用特权

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

本版积分规则

4

主题

23

帖子

0

粉丝