- void I2C_Configure(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- I2C_InitTypeDef I2C_InitStruct;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
- I2C_DeInit(I2C1);
- I2C_StructInit(&I2C_InitStruct);
- I2C_InitStruct.I2C_Mode = I2C_MODE_MASTER;
- I2C_InitStruct.I2C_OwnAddress = I2C_OWN_ADDRESS;
- I2C_InitStruct.I2C_ClockSpeed = 100000;
- I2C_Init(I2C1, &I2C_InitStruct);
- I2C_TargetAddressConfig(I2C1, EEPROM_I2C_ADDRESS);
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
- GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_1);
- GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_1);
- GPIO_StructInit(&GPIO_InitStruct);
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_OD;
- GPIO_Init(GPIOB, &GPIO_InitStruct);
- I2C_Cmd(I2C1, ENABLE);
- }
配置硬件i2c读写功能
- void I2C_TxData_Polling(uint8_t *Buffer, uint8_t Length)
- {
- uint8_t i = 0;
- for (i = 0; i < Length; i++)
- {
- I2C_SendData(I2C1, Buffer[i]);
- while (RESET == I2C_GetFlagStatus(I2C1, I2C_STATUS_FLAG_TFE))
- {
- }
- }
- }
eeprom写数据先发地址位,再发数据位,等等ack完成后,发送i2c停止,这个地方等待ack是循环等待方式,需要增加超时机制,不然i2c设备如果异常就会卡死在里面
eeprom使用硬件i2c进行存储和读取,写入Hello 21ic, Hello MM32F0121字符串并读出打印出来,通过sizeof(WriteBuffer)记录数据长度,不用自己算长度
- uint8_t i = 0;
- uint8_t ReadBuffer[50], WriteBuffer[] = {"Hello 21ic, Hello MM32F0121"};
- printf("\r\nTest %s", __FUNCTION__);
- I2C_Configure();
- for (i = 0; i < 50; i++)
- {
- ReadBuffer[i] = 0;
- }
- printf("\r\n\r\nEEPROM Write : ");
- EEPROM_WriteData(0, WriteBuffer, sizeof(WriteBuffer));
- printf("OK");
- printf("\r\n\r\nEEPROM Read : \r\n");
- EEPROM_ReadData(0, ReadBuffer, sizeof(WriteBuffer));
- for (i = 0; i < sizeof(WriteBuffer); i++)
- {
- printf("%c", ReadBuffer[i]);
-
- } printf("\r\n");
以下是下载后的效果
2、spi测试
使用例程SPI_Master_FLASH_Polling工程进行测试,打开工程
SPI初始化,使用硬件SPI的SPI1,使用的PA4/PA5/PA6/PA7,根据数据手册,使用AF0功能
spi使用的APB2时钟,72MHZ,用的256分频,约为28KHZ的速率
- void SPI_Configure(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- SPI_InitTypeDef SPI_InitStruct;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
- SPI_StructInit(&SPI_InitStruct);
- SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
- SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
- SPI_InitStruct.SPI_DataWidth = 8;
- SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
- SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
- SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
- SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
- SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
- SPI_Init(SPI1, &SPI_InitStruct);
- SPI_BiDirectionalLineConfig(SPI1, SPI_Enable_RX);
- SPI_BiDirectionalLineConfig(SPI1, SPI_Enable_TX);
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
- GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_0);
- GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_0);
- GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_0);
- GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_0);
- GPIO_StructInit(&GPIO_InitStruct);
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_Init(GPIOA, &GPIO_InitStruct);
- GPIO_StructInit(&GPIO_InitStruct);
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
- GPIO_Init(GPIOA, &GPIO_InitStruct);
- SPI_Cmd(SPI1, ENABLE);
- }
SPI读写功能,通过库函数spi_senddata进行发送即可,等等spi发送完成标准,这个等待也是死等,如果spi设备异常,也会导致卡死在循环里面,所有也要和上面i2c一样,添加超时机制。
- void SPI_TxData_Polling(uint8_t *Buffer, uint8_t Length)
- {
- uint8_t i = 0, Data = 0;
- uint16_t timeout = 1000;
- for (i = 0; i < Length; i++)
- {
- SPI_SendData(SPI1, Buffer[i]);
- timeout = 1000;
- while (RESET == SPI_GetFlagStatus(SPI1, SPI_FLAG_TXEPT) && timeout >0)
然后使用spi存储Hello 21ic, Hello MM32F0121字符串读出并打印出来
函数处理,通过sizeof(WriteBuffer)记录数据长度,不用自己算长度
- void SPI_Master_FLASH_Polling_Sample(void)
- {
- uint8_t i = 0;
- uint8_t ReadBuffer[100], WriteBuffer[] = {"Hello 21ic, Hello MM32F0121"};
- printf("\r\nTest %s", __FUNCTION__);
- SPI_Configure();
- SPI_FLASH_ReadDeviceID();
- SPI_FLASH_ReadJEDEC_ID();
- printf("\r\nSPI FLASH Sector Erase...");
- SPI_FLASH_SectorErase(0);
- SPI_FLASH_PageProgram(0, WriteBuffer, sizeof(WriteBuffer));
- printf("\r\nSPI FLASH Read...");
- SPI_FLASH_FastRead(0, ReadBuffer, sizeof(WriteBuffer));
- for (i = 0; i < sizeof(WriteBuffer); i++)
- {
- printf("%c", ReadBuffer[i]);
- }
- }
效果图如下