日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32 FMPI2C 简单访问代码

發(fā)布時間:2023/12/8 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32 FMPI2C 简单访问代码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

網(wǎng)上這方面內(nèi)容較少,又由于DMA Stream全部被占,所以自己寫了一個簡單的直接訪問代碼,供需要者參考。

1. 初始化:

void InitFMPI2C(void)
{
?? ?GPIO_InitTypeDef ?GPIO_InitStructure;
?? ?FMPI2C_InitTypeDef ?I2C_InitStructure;
??
?? ?printf("Init FMP I2C\r\n");
? ??
?? ?RCC_AHB1PeriphClockCmd(PERI_FMPI2C1_SCL_GPIO_CLK | PERI_FMPI2C1_SDA_GPIO_CLK, ENABLE);
?? ?RCC_APB1PeriphClockCmd(PERI_FMPI2C1_CLK, ENABLE);
?? ?RCC_APB1PeriphResetCmd(PERI_FMPI2C1_CLK, ENABLE);? ??
? ?
?? ?RCC_APB1PeriphResetCmd(PERI_FMPI2C1_CLK, DISABLE);

?? ?/* Connect PXx to I2C_SCL*/
?? ?GPIO_PinAFConfig(PERI_FMPI2C1_SCL_GPIO_PORT, PERI_FMPI2C1_SCL_SOURCE, PERI_FMPI2C1_SCL_AF);? ??
?? ?/* Connect PXx to I2C_SDA*/
?? ?GPIO_PinAFConfig(PERI_FMPI2C1_SDA_GPIO_PORT, PERI_FMPI2C1_SDA_SOURCE, PERI_FMPI2C1_SDA_AF);
?? ?
?? ?/* GPIO configuration */ ?
?? ?/* Configure sEE_I2C pins: SCL */
?? ?GPIO_InitStructure.GPIO_Pin = PERI_FMPI2C1_SCL_PIN;
?? ?GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
?? ?GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
?? ?GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
?? ?GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
?? ?GPIO_Init(PERI_FMPI2C1_SCL_GPIO_PORT, &GPIO_InitStructure);
?? ?
?? ?/* Configure sEE_I2C pins: SDA */
?? ?GPIO_InitStructure.GPIO_Pin = PERI_FMPI2C1_SDA_PIN;
?? ?GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
?? ?GPIO_Init(PERI_FMPI2C1_SDA_GPIO_PORT, &GPIO_InitStructure);?? ?

?? ?I2C_InitStructure.FMPI2C_Mode = FMPI2C_Mode_FMPI2C;
?? ?I2C_InitStructure.FMPI2C_Timing = 0x00308FF9; //0x00303D5B;? // 此數(shù)由Stm32CubeMX工具產(chǎn)生。
?? ?I2C_InitStructure.FMPI2C_AnalogFilter = FMPI2C_AnalogFilter_Enable;
?? ?I2C_InitStructure.FMPI2C_AcknowledgedAddress = FMPI2C_AcknowledgedAddress_7bit;
?? ?I2C_InitStructure.FMPI2C_Ack = FMPI2C_Ack_Enable;

?? ?FMPI2C_Init(PERI_FMPI2C1, &I2C_InitStructure);
?? ?FMPI2C_Cmd(PERI_FMPI2C1, ENABLE);
}
?

2. Read,Write 實(shí)現(xiàn):

static BYTE FMPI2C_CheckBusy(void)
{
?? ?DWORD TimeOut = I2C_LONG_TIMEOUT;
?? ?BYTE return_flag = I2C_OK;
?? ?while (FMPI2C_GetFlagStatus(FMPI2C1, FMPI2C_FLAG_BUSY))
?? ?{
?? ??? ?if((TimeOut--) == 0)
?? ??? ?{
?? ??? ??? ?return_flag = I2C_NOT_FREE;
?? ??? ??? ?break;
?? ??? ?}
?? ?}

?? ?return return_flag;
}

static BYTE FMPI2C_Start(BYTE dAddr, BYTE nSize, BYTE mode)
{
?? ?FMPI2C_MasterRequestConfig(FMPI2C1, mode);
?? ?FMPI2C_SlaveAddressConfig(FMPI2C1, dAddr);
?? ?FMPI2C_NumberOfBytesConfig(FMPI2C1, nSize);
?? ?FMPI2C_AutoEndCmd(FMPI2C1, ENABLE);
?? ?FMPI2C_GenerateSTART(FMPI2C1, ENABLE);
?? ?return I2C_OK;
}

static BYTE FMPI2C_GetByte()
{
?? ?BYTE read;

?? ?I2CTimeout = I2C_LONG_TIMEOUT;
?? ?while(FMPI2C_GetFlagStatus(FMPI2C1, FMPI2C_FLAG_RXNE) == RESET)
?? ??? ?{if((I2CTimeout--) == 0) return I2C_TIME_OUT;}
?? ?
?? ?read = FMPI2C_ReceiveData(FMPI2C1);

?? ?return read;
}

static void FMPI2C_Clear(void)
{
?? ?FMPI2C1->ICR = 0x0000FFFF;
}

static BYTE FMPI2C_Wait_Event(DWORD event)
{
?? ?DWORD TimeOut = I2C_LONG_TIMEOUT;
?? ?BYTE return_flag = SET;
?? ?while (!FMPI2C_GetFlagStatus(FMPI2C1, event))
?? ?{
?? ??? ?if((TimeOut--) == 0)
?? ??? ?{
?? ??? ??? ?return_flag = RESET;
?? ??? ??? ?break;
?? ??? ?}
?? ?}

?? ?return return_flag;
?? ?
}

//--------------------------------------------------------------------------------------------------------------------------
BYTE FMPI2C_Write(BYTE dAddr, BYTE rAddr, PBYTE pBuff, WORD bytes)
{
?? ?uint32_t i = 0, j = 0;

?? ?if(FMPI2C_CheckBusy())
?? ?{
?? ??? ?printf("FMP I2C Busy!\r\n");
?? ??? ?return I2C_NOT_FREE;
?? ??? ?
?? ?}
?? ?FMPI2C_Clear();

?? ?FMPI2C_Start(dAddr, bytes+1, I2C_Direction_Transmitter);
?? ?
?? ?if(FMPI2C_Wait_Event(FMPI2C_FLAG_TXIS))
?? ?{
?? ??? ?FMPI2C_SendData(FMPI2C1, rAddr);
?? ??? ?j = 0;
?? ?}
?? ?else {
?? ??? ?printf("FMP I2C Write Error Start[%08X]\r\n", FMPI2C1->ISR);
?? ??? ?return I2C_NOT_START;
?? ?}
?? ?
?? ?for (i=0; i<bytes; i++)
?? ?{
?? ??? ?if(FMPI2C_Wait_Event(FMPI2C_FLAG_TXIS))
?? ??? ?{
?? ??? ??? ?FMPI2C_SendData(FMPI2C1, pBuff[i]);
?? ??? ??? ?j++;
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?printf("FMP I2C Write Data Error[%d][%08X]\r\n", j, FMPI2C1->ISR);
?? ??? ?}
?? ?}
?? ?
?? ?if(!FMPI2C_Wait_Event(FMPI2C_FLAG_STOPF))
?? ?{
?? ??? ?printf("FMP I2C Write STOP error[%08X]\r\n", FMPI2C1->ISR);
?? ?}
?? ?FMPI2C_Clear();

?? ?return I2C_OK;
}

//--------------------------------------------------------------------------------------------------------------------------
BYTE FMPI2C_Read(BYTE dAddr, BYTE rAddr, PBYTE pBuff, WORD bytes)
{
?? ?uint32_t i;

?? ?if(FMPI2C_CheckBusy())
?? ?{
?? ??? ?printf("FMP I2C Busy!\r\n");
?? ??? ?return I2C_NOT_FREE;
?? ?}
?? ?FMPI2C_Clear();

?? ?FMPI2C_Start(dAddr, 1, I2C_Direction_Transmitter);
?? ?if(FMPI2C_Wait_Event(FMPI2C_FLAG_TXIS))
?? ?{
?? ??? ?FMPI2C_SendData(FMPI2C1, rAddr);
?? ?}
?? ?else {
?? ??? ?printf("FMP I2C Error Start[%08X]\r\n", FMPI2C1->ISR);
?? ??? ?return I2C_NOT_START;
?? ?}
?? ?FMPI2C_Wait_Event(FMPI2C_FLAG_STOPF);
?? ?
?? ?//printf("FMP I2C Write STOP [%08X]\r\n", FMPI2C1->ISR);

?? ?FMPI2C_ClearFlag(FMPI2C1, FMPI2C_FLAG_STOPF);

?? ?//return I2C_NO_DATA;
?? ?if(FMPI2C_CheckBusy())
?? ?{
?? ??? ?printf("FMP I2C Busy!\r\n");
?? ??? ?return I2C_NOT_FREE;
?? ?}
?? ?FMPI2C_Clear();
?? ?
?? ?FMPI2C_Start(dAddr, bytes, I2C_Direction_Receiver);

?? ?for (i=0; i<bytes; i++){
?? ??? ?pBuff[i] = FMPI2C_GetByte();
?? ?}
?? ??? ?
?? ?FMPI2C_Wait_Event(FMPI2C_FLAG_STOPF);
?? ?FMPI2C_Clear();

?? ?return I2C_OK;?
}
?

?

總結(jié)

以上是生活随笔為你收集整理的STM32 FMPI2C 简单访问代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。