久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
STM32軟件IIC SPI程序 方便移植
[打印本頁]
作者:
AA9527
時間:
2019-3-23 11:37
標題:
STM32軟件IIC SPI程序 方便移植
提供軟IIC隨意移植隨意改接口
眾所周知 stm32的硬件iIC協議不好用
0.png
(5.62 KB, 下載次數: 65)
下載附件
2019-3-30 00:46 上傳
99999.png
(2.84 KB, 下載次數: 66)
下載附件
2019-3-23 11:36 上傳
單片機源程序如下:
#include "myiic.h"
#include "delay.h"
//已刪除所有延時 1 - 2us延時 若IIC通信出錯或許是沒有延時問題
//或者時鐘源問題
void IIC_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
/****************************IIC_SDA初始化***********************************************/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_IIC_SDA_PORT, ENABLE); //使能SDA連接端口時鐘 /
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_SDA; //SDA端口配置 /
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出 /
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz /
GPIO_Init(GPIO_SDA_PORT, &GPIO_InitStructure); //根據設定參數初始化SDA /
/****************************IIC_SCL初始化***********************************************/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_IIC_SCL_PORT, ENABLE); //使能SCL連接端口時鐘 /
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_SCL; //SCL端口配置 /
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出 /
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz /
GPIO_Init(GPIO_SCL_PORT, &GPIO_InitStructure); //根據設定參數初始化SCL /
/****************************************************************************************/
}
/**********************************************/
// IIC Start
//開始信號:在SCL為高電平時,SDA由高電平向低電平跳變,開始傳輸數據。
/**********************************************/
void IIC_Start()
{
SDA_OUT();
IIC_SCL=1;
IIC_SDA=1;
delay_us(2);
IIC_SDA=0;
delay_us(2);
IIC_SCL=0;
}
/**********************************************/
// IIC Stop
//結束信號:在SCL為高電平時,SDA由低電平向高電平跳變,結束傳輸數據。
/**********************************************/
void IIC_Stop()
{
SDA_OUT();
IIC_SCL=1;
IIC_SDA=0;
delay_us(2);
IIC_SDA=1;
delay_us(2);
}
/**********************************************/
// IIC主機產生ACK應答信號
/**********************************************/
void IIC_ACK(void)
{
SDA_OUT();
IIC_SCL=0;
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
/**********************************************/
// IIC主機不產生ACK應答信號
/**********************************************/
void IIC_NACK(void)
{
SDA_OUT();
IIC_SCL=0;
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
/**********************************************/
// IIC Wait Ack
//等待應答信號到來
//返回值 1,接收應答失敗
// 0,接收應答成功
/**********************************************/
unsigned char IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN(); //SDA設置為輸入
IIC_SDA=1;
IIC_SCL=1;
delay_us(2);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;//時鐘輸出0
return 0;
}
/**********************************************
// IIC Write byte
//IIC寫一個字節
**********************************************/
void IIC_Write_Byte(unsigned char data)
{
unsigned char i;
SDA_OUT();
IIC_SCL=0;//拉低時鐘開始數據傳輸
for(i=0;i<8;i++)
{
IIC_SDA=(data&0x80)>>7;
data=data<<1;
// delay_us(2); //對TEA5767芯片這三個延時都是必須的
IIC_SCL=1;
// delay_us(2);
IIC_SCL=0;
// delay_us(2);
}
}
/**********************************************
// IIC Write Data
**********************************************/
void IIC_Write_Data(unsigned char Device_addr,unsigned char Reg_addr,unsigned char data)
{
IIC_Start();
SDA_OUT();
IIC_Write_Byte(Device_addr | 0x00); //器件地址(7位) + 讀寫位(讀1寫0)
IIC_Wait_Ack();
IIC_Write_Byte(Reg_addr); //要寫入數據的寄存器地址
IIC_Wait_Ack();
IIC_Write_Byte(data);
IIC_Wait_Ack();
IIC_Stop();
}
/**********************************************
// IIC Read byte
//IIC讀一個字節
//讀1個字節,ack=1時,發送ACK,ack=0,發送nACK
**********************************************/
unsigned char IIC_Read_Byte(unsigned char Ack_EN)
{
unsigned char i,receive=0;
SDA_IN();//SDA設置為輸入
for(i=0;i<8;i++ )
{
IIC_SCL=0;
delay_us(2);
IIC_SCL=1;
receive<<=1;
if(READ_SDA)receive++;
delay_us(1);
}
if (!Ack_EN)
IIC_NACK();//發送nACK
else
IIC_ACK(); //發送ACK
return receive;
}
/**********************************************
// IIC Read Data
**********************************************/
unsigned char IIC_Read_Data(unsigned char Device_addr,unsigned char Reg_addr,unsigned char ACK_EN)
{
unsigned char receive;
IIC_Start();
IIC_Write_Byte(Device_addr | 0x00); //器件地址(7位) + 讀寫位(寫0)
IIC_Wait_Ack();
IIC_Write_Byte(Reg_addr); //要讀數據的寄存器地址
IIC_Wait_Ack();
IIC_Start();
SDA_IN();
IIC_Write_Byte(Device_addr | 0x01); //器件地址(7位) + 讀寫位(讀1)
IIC_Wait_Ack();
receive=IIC_Read_Byte(0);
IIC_Wait_Ack();
IIC_Stop();
return receive;
}
復制代碼
所有資料51hei提供下載:
IIC.zip
(2.18 KB, 下載次數: 72)
2019-3-23 11:33 上傳
點擊文件名下載附件
C.H
下載積分: 黑幣 -5
作者:
QYH196114
時間:
2021-11-6 19:10
是不同芯片之間的嗎
作者:
WQH14982678
時間:
2021-11-10 07:56
不同芯片之間稍加修改就可以通用嗎?
作者:
kavin21513
時間:
2021-12-1 08:02
正需要,不知能不能移植到51上
作者:
baozi123
時間:
2023-5-22 17:13
正需要,不知能不能移植到51上
作者:
xxxx13
時間:
2023-6-26 10:17
正在學習i2c,感謝樓主
作者:
kissme
時間:
2023-11-12 18:29
/SDA IO方向設置
#define SDA_IN() {GPIOB->CRH&=0XFFFFFFF0;GPIOA->CRH|=8<<7;}
#define SDA_OUT() {GPIOB->CRH&=0XFFFFFFF0;GPIOA->CRH|=3<<7;}
#define IIC_SCL PBout(6)//SCL
#define IIC_SDA PBout(7)//SDA
#define READ_SDA PBin(7) //SDA狀態讀取
請問下。GPIO7的口改變輸入狀態是GPIOB->CRH&=0XFFFFFFF0;GPIOA->CRH|=8<<7;???這個不應該是GPIO-8咩???怎么后面又是GPIOA??.求大神賜教。謝謝
作者:
liixaofei5
時間:
2023-11-17 12:31
學習了。不過總聽說芯片IIC不好用,具體什么原因?原本認為用現成的硬件比較方便
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产欧美一区二区精品性色超碰
|
欧美日韩
|
最新日韩在线
|
最新国产精品视频
|
av手机版
|
国产精品久久午夜夜伦鲁鲁
|
成人免费精品
|
黄色大片免费在线观看
|
av一道本
|
超碰在线中文字幕
|
国产无精乱码一区二区三区
|
午夜久久久久久
|
中文字幕高清在线
|
日本公妇乱偷中文字幕
|
国产香蕉av
|
999免费视频
|
91精品国产麻豆国产自产在线
|
亚洲天堂久久久
|
欧美日韩精品久久久免费观看
|
中文字幕日韩视频
|
久操精品
|
亚洲成年人在线观看
|
伊人成人在线视频
|
亚洲久久久
|
97超碰在线播放
|
成人福利网
|
天天射天天干天天操
|
午夜时刻免费入口
|
欧美精品二区三区四区免费看视频
|
亚洲国产日韩欧美
|
国产欧美另类
|
欧美一级全黄
|
国产黄色一区二区
|
欧美视频在线观看免费
|
日本中文在线观看
|
久久久在线
|
我想看毛片
|
天天爽夜夜爽夜夜爽精品视频
|
欧美在线视频一区二区
|
91亚洲精品在线
|
毛片视频免费
|