STM32模擬I2C總線程序,測試可用
單片機源程序如下:
- #include <includes.h>
- #include "myiic.h"
- #include "delay.h"
- #define SCL_H GPIOB->BSRR = GPIO_Pin_6
- #define SCL_L GPIOB->BRR = GPIO_Pin_6
-
- #define SDA_H GPIOB->BSRR = GPIO_Pin_7
- #define SDA_L GPIOB->BRR = GPIO_Pin_7
-
- #define SCL_read GPIOB->IDR & GPIO_Pin_6
- #define SDA_read GPIOB->IDR & GPIO_Pin_7
- OS_SEM IIC_SemLock;
- //初始化IIC
- void IIC_Init(void)
- {
- OS_ERR err = OS_ERR_NONE;
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD ; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB6,PB7 輸出高
- OSSemCreate(&IIC_SemLock,"",1,&err);
- }
- void IIC_Lock(void)
- {
- OS_ERR err = OS_ERR_NONE;
- OSSemPend(&IIC_SemLock,0,OS_OPT_PEND_BLOCKING,NULL,&err);
- }
- void IIC_UnLock(void)
- {
- OS_ERR err = OS_ERR_NONE;
- OSSemPost(&IIC_SemLock,OS_OPT_POST_ALL,&err);
- }
- u8 IIC_Start(void)
- {
- SDA_H;
- SCL_H;
- delay_us(5);
- if(!SDA_read)return 0;
- SDA_L;
- delay_us(5);
- if(SDA_read)return 0;
- SDA_L;
- delay_us(5);
- return 1;
- }
-
- void IIC_Stop(void)
- {
- SCL_L;
- delay_us(5);
- SDA_L;
- delay_us(5);
- SCL_H;
- delay_us(5);
- SDA_H;
- delay_us(5);
- }
- void IIC_Ack(void)
- {
- SCL_L;
- delay_us(5);
- SDA_L;
- delay_us(5);
- SCL_H;
- delay_us(5);
- SCL_L;
- delay_us(5);
- }
- void IIC_NoAck(void)
- {
- SCL_L;
- delay_us(5);
- SDA_H;
- delay_us(5);
- SCL_H;
- delay_us(5);
- SCL_L;
- delay_us(5);
- }
- u8 IIC_WaitAck(void)
- {
-
- SCL_L;
- delay_us(5);
- SDA_H;
- delay_us(5);
- SCL_H;
- delay_us(5);
- if(SDA_read)
- {
- SCL_L;
- return 0;
- }
- SCL_L;
- return 1;
- }
- void IIC_SendByte(u8 SendByte)
- {
- u8 i=8;
- while(i--)
- {
- SCL_L;
- delay_us(5);
- if(SendByte&0x80)
- SDA_H;
- else
- SDA_L;
- SendByte<<=1;
- delay_us(5);
- SCL_H;
- delay_us(5);
- }
- SCL_L;
- }
- u8 IIC_ReceiveByte(void)
- {
- u8 i=8;
- u8 ReceiveByte=0;
- SDA_H;
- while(i--)
- {
- ReceiveByte<<=1;
- SCL_L;
- delay_us(5);
- SCL_H;
- delay_us(5);
- if(SDA_read)
- {
- ReceiveByte|=0x01;
- }
- }
- SCL_L;
- return ReceiveByte;
- }
- u8 IIC_BufferRead(u8* pBuffer,u16 length,u8 DeviceAddress)
- {
- if(!IIC_Start())return 0;
- IIC_SendByte(DeviceAddress|0x01);
- if(!IIC_WaitAck())
- {
- IIC_Stop();
- return 0;
- }
- while(length)
- {
- *pBuffer++=IIC_ReceiveByte();
- length--;
- if(length>0)IIC_Ack();
- else IIC_NoAck();
- }
- IIC_Stop();
- delay_ms(1);
- return 1;
- }
- u8 IIC_BufferWrite(u8* pBuffer, u16 length, u8 DeviceAddress)
- {
- if(!IIC_Start())return 0;
- IIC_SendByte(DeviceAddress);
- if(!IIC_WaitAck())
- {
- IIC_Stop();
- return 0;
- }
- while(length)
- {
- IIC_SendByte(* pBuffer);
- IIC_WaitAck();
- length--;
- pBuffer++;
- }
- IIC_Stop();
- delay_ms(5);
- return 1;
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
IIC.rar
(1.86 KB, 下載次數: 36)
2018-4-6 14:34 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|