[MM32硬件] 【灵动微电子MM32F0121测评】4、i2c+spi测试

[复制链接]
 楼主| 发表于 2025-6-14 21:52 | 显示全部楼层 |阅读模式
1、i2c测试
使用例程I2C_Master_EEPROM_Polling工程进行测试
41507684d7941a3850.png
i2c配置,使用了硬件i2c节课,波特率是100k,主机模式,使用了pb10和Pb11引脚,根据数据手册是使用的AF1功能
89728684d79c82b1fc.png
以下是代码配置
  1. void I2C_Configure(void)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStruct;
  4.     I2C_InitTypeDef  I2C_InitStruct;

  5.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

  6.     I2C_DeInit(I2C1);

  7.     I2C_StructInit(&I2C_InitStruct);
  8.     I2C_InitStruct.I2C_Mode       = I2C_MODE_MASTER;
  9.     I2C_InitStruct.I2C_OwnAddress = I2C_OWN_ADDRESS;
  10.     I2C_InitStruct.I2C_ClockSpeed = 100000;
  11.     I2C_Init(I2C1, &I2C_InitStruct);

  12.     I2C_TargetAddressConfig(I2C1, EEPROM_I2C_ADDRESS);

  13.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);

  14.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_1);
  15.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_1);

  16.     GPIO_StructInit(&GPIO_InitStruct);
  17.     GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_10 | GPIO_Pin_11;
  18.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
  19.     GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AF_OD;
  20.     GPIO_Init(GPIOB, &GPIO_InitStruct);

  21.     I2C_Cmd(I2C1, ENABLE);
  22. }
配置硬件i2c读写功能
  1. void I2C_TxData_Polling(uint8_t *Buffer, uint8_t Length)
  2. {
  3.     uint8_t i = 0;

  4.     for (i = 0; i < Length; i++)
  5.     {
  6.         I2C_SendData(I2C1, Buffer[i]);

  7.         while (RESET == I2C_GetFlagStatus(I2C1, I2C_STATUS_FLAG_TFE))
  8.         {
  9.         }
  10.     }
  11. }

eeprom写数据先发地址位,再发数据位,等等ack完成后,发送i2c停止,这个地方等待ack是循环等待方式,需要增加超时机制,不然i2c设备如果异常就会卡死在里面
eeprom使用硬件i2c进行存储和读取,写入Hello 21ic, Hello MM32F0121字符串并读出打印出来,通过sizeof(WriteBuffer)记录数据长度,不用自己算长度
  1. uint8_t i = 0;
  2.     uint8_t ReadBuffer[50], WriteBuffer[] = {"Hello 21ic, Hello MM32F0121"};

  3.     printf("\r\nTest %s", __FUNCTION__);

  4.     I2C_Configure();

  5.     for (i = 0; i < 50; i++)
  6.     {
  7.         ReadBuffer[i]  = 0;
  8.     }

  9.     printf("\r\n\r\nEEPROM Write : ");

  10.     EEPROM_WriteData(0, WriteBuffer, sizeof(WriteBuffer));

  11.     printf("OK");

  12.     printf("\r\n\r\nEEPROM Read  : \r\n");

  13.     EEPROM_ReadData(0, ReadBuffer,  sizeof(WriteBuffer));

  14.     for (i = 0; i <  sizeof(WriteBuffer); i++)
  15.     {
  16.         printf("%c", ReadBuffer[i]);

  17.       
  18.     } printf("\r\n");
以下是下载后的效果
41365684d7b6f569b0.png
2、spi测试
使用例程SPI_Master_FLASH_Polling工程进行测试,打开工程
42918684d7b8bc5904.png
SPI初始化,使用硬件SPI的SPI1,使用的PA4/PA5/PA6/PA7,根据数据手册,使用AF0功能
35569684d7cc7b39f6.png
spi使用的APB2时钟,72MHZ,用的256分频,约为28KHZ的速率
  1. void SPI_Configure(void)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStruct;
  4.     SPI_InitTypeDef  SPI_InitStruct;

  5.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

  6.     SPI_StructInit(&SPI_InitStruct);
  7.     SPI_InitStruct.SPI_Mode      = SPI_Mode_Master;
  8.     SPI_InitStruct.SPI_DataSize  = SPI_DataSize_8b;
  9.     SPI_InitStruct.SPI_DataWidth = 8;
  10.     SPI_InitStruct.SPI_CPOL      = SPI_CPOL_Low;
  11.     SPI_InitStruct.SPI_CPHA      = SPI_CPHA_1Edge;
  12.     SPI_InitStruct.SPI_NSS       = SPI_NSS_Soft;
  13.     SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
  14.     SPI_InitStruct.SPI_FirstBit  = SPI_FirstBit_MSB;
  15.     SPI_Init(SPI1, &SPI_InitStruct);

  16.     SPI_BiDirectionalLineConfig(SPI1, SPI_Enable_RX);
  17.     SPI_BiDirectionalLineConfig(SPI1, SPI_Enable_TX);

  18.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

  19.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource4,  GPIO_AF_0);
  20.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource5,  GPIO_AF_0);
  21.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource6,  GPIO_AF_0);
  22.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource7,  GPIO_AF_0);

  23.     GPIO_StructInit(&GPIO_InitStruct);
  24.     GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;
  25.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
  26.     GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AF_PP;
  27.     GPIO_Init(GPIOA, &GPIO_InitStruct);

  28.     GPIO_StructInit(&GPIO_InitStruct);
  29.     GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_6;
  30.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
  31.     GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_IPU;
  32.     GPIO_Init(GPIOA, &GPIO_InitStruct);

  33.     SPI_Cmd(SPI1, ENABLE);
  34. }
SPI读写功能,通过库函数spi_senddata进行发送即可,等等spi发送完成标准,这个等待也是死等,如果spi设备异常,也会导致卡死在循环里面,所有也要和上面i2c一样,添加超时机制。
  1. void SPI_TxData_Polling(uint8_t *Buffer, uint8_t Length)
  2. {
  3.     uint8_t i = 0, Data = 0;
  4. uint16_t timeout = 1000;
  5.     for (i = 0; i < Length; i++)
  6.     {
  7.         SPI_SendData(SPI1, Buffer[i]);
  8. timeout = 1000;
  9.         while (RESET == SPI_GetFlagStatus(SPI1, SPI_FLAG_TXEPT) && timeout >0)
然后使用spi存储Hello 21ic, Hello MM32F0121字符串读出并打印出来
函数处理,通过sizeof(WriteBuffer)记录数据长度,不用自己算长度
  1. void SPI_Master_FLASH_Polling_Sample(void)
  2. {
  3.     uint8_t i = 0;
  4.     uint8_t ReadBuffer[100], WriteBuffer[] = {"Hello 21ic, Hello MM32F0121"};

  5.     printf("\r\nTest %s", __FUNCTION__);

  6.     SPI_Configure();

  7.     SPI_FLASH_ReadDeviceID();

  8.     SPI_FLASH_ReadJEDEC_ID();

  9.     printf("\r\nSPI FLASH Sector Erase...");

  10.     SPI_FLASH_SectorErase(0);


  11.     SPI_FLASH_PageProgram(0, WriteBuffer, sizeof(WriteBuffer));

  12.     printf("\r\nSPI FLASH Read...");

  13.     SPI_FLASH_FastRead(0, ReadBuffer, sizeof(WriteBuffer));

  14.     for (i = 0; i < sizeof(WriteBuffer); i++)
  15.     {

  16.         printf("%c", ReadBuffer[i]);
  17.     }
  18. }
效果图如下
43845684d7e8b706b3.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

256

帖子

3

粉丝
快速回复 返回顶部 返回列表