久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2309|回復: 0
打印 上一主題 下一主題
收起左側

stm32f103c8 固件庫 I2C相關問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:141497 發表于 2019-5-27 22:12 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請教各位大大:由于近期要用STM32做一個項目用到I2C協議,調用固件庫I2C協議編程,最后發現是I2C部分程序問題,單獨測試I2C讀寫24C02失敗.好幾天了沒有查出原因,請教各位是怎么回事?謝謝了!!!
下面是我寫的代碼:
/*-------------------------------------------------------------------------------
1 STM32F103C8T6 i2c1(at24c02) TEST HSE8M*9M=72m;
2 display:max7219模塊;
------------------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "stm32f10x_i2c.h"
#include "stm32f10x_spi.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#define uchar unsigned char
#define uint unsigned int
uchar leddula[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,
0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x67,0x3e};//0123456789ABCDEFPU
uchar cf=0x20;
void sysinit(void);
void clock(void);
void sgpio(void);
void sysspi(void);
void init7219(void);
void i2cinit(void);
void delay(vu32 nCount);
void ackst(void);//ACK
void i2cwritebyte(uchar addr,uchar date);
uchar i2creadbyte(uchar addr);
void display(void);
void maxdisp(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f,uchar g,uchar h);
void clear7219(void);
void sendbyte(uchar datt);
void sendword(uchar addr,uchar dat);
int main(void)
{
        sysinit();
        while(1)
                {
                        display();
                }
}
void sysinit(void)
{
        clock();
        sgpio();
        sysspi();
        i2cinit();
}
void clock(void)
{
        RCC_HSEConfig(RCC_HSE_ON);
        while(RCC_GetFlagStatus(RCC_FLAG_HSERDY)==RESET);
        RCC_PLLCmd(ENABLE);
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);//8m*9m=72m
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
        RCC_HSICmd(DISABLE);
}
void sgpio(void)//GPIO
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
        GPIO_InitTypeDef GPIO_Initstructure;
        GPIO_Initstructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_7;//5 clk,6 mosi
        GPIO_Initstructure.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_Initstructure);
        GPIO_Initstructure.GPIO_Pin=GPIO_Pin_6;//6 miso
        GPIO_Initstructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;;
        GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_Initstructure);
        GPIO_Initstructure.GPIO_Pin=GPIO_Pin_4;//4 cs
        GPIO_Initstructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_Initstructure);
        GPIO_SetBits(GPIOA, GPIO_Pin_4);//cs=1
        GPIO_Initstructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;//I2C1 6SCL 7SDA
        GPIO_Initstructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_Initstructure);
        GPIO_Initstructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
        GPIO_Initstructure.GPIO_Mode=GPIO_Mode_AF_OD;
        GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_Initstructure);
}
void i2cinit(void)//I2C
{
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
        I2C_InitTypeDef I2C_InitStructure;
        I2C_InitStructure.I2C_ClockSpeed=50000;//50khz
  I2C_InitStructure.I2C_Mode=I2C_Mode_I2C;
  I2C_InitStructure.I2C_DutyCycle=I2C_DutyCycle_2;
  I2C_InitStructure.I2C_OwnAddress1=0xcd;
  I2C_InitStructure.I2C_Ack=I2C_Ack_Disable;
        I2C_InitStructure.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;
        I2C_Init(I2C1, &I2C_InitStructure);
        GPIO_SetBits(GPIOB, GPIO_Pin_6|GPIO_Pin_7);
        I2C_Cmd(I2C1, ENABLE);
        i2cwritebyte(0x40,0x20);
}
void sysspi(void)//SPI
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
        SPI_InitTypeDef SPI_InitStructure;
  SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
        SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
        SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;
        SPI_InitStructure.SPI_CPOL=SPI_CPOL_High;
        SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;
        SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;
        SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_2;
        SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;
        SPI_InitStructure.SPI_CRCPolynomial=7;
        SPI_Init(SPI1,&SPI_InitStructure);
        SPI_Cmd(SPI1,ENABLE);
        init7219();
}
void ackst(void)//ACK
{
        if(I2C_GetFlagStatus(I2C1,I2C_FLAG_AF)==RESET)
                {
                        I2C_ClearFlag(I2C1,I2C_FLAG_AF);
                        I2C_GenerateSTOP(I2C1,ENABLE);
                }
}
void i2cwritebyte(uchar addr,uchar date)
{
        I2C_GenerateSTART(I2C1,ENABLE);
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_SB)==RESET);//START OK
        I2C_ClearFlag(I2C1,I2C_FLAG_SB);
        I2C_Send7bitAddress(I2C1,0xa0,I2C_Direction_Transmitter);
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_ADDR)==RESET);//addr OK
        I2C_ClearFlag(I2C1,I2C_FLAG_ADDR);
        ackst();
        I2C_SendData(I2C1, addr);
        ackst();
        I2C_SendData(I2C1, addr);
        ackst();
        I2C_GenerateSTOP(I2C1,ENABLE);
        I2C_ClearFlag(I2C1,I2C_FLAG_BTF);
}
uchar i2creadbyte(uchar addr)
{
  uchar data;
        I2C_GenerateSTART(I2C1,ENABLE);
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_SB)==RESET);//START OK
        I2C_ClearFlag(I2C1,I2C_FLAG_SB);
        I2C_Send7bitAddress(I2C1,0xa0,I2C_Direction_Transmitter);
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_ADDR)==RESET);//addr OK
        I2C_ClearFlag(I2C1,I2C_FLAG_ADDR);
        ackst();
        I2C_SendData(I2C1, addr);
        ackst();
        I2C_GenerateSTART(I2C1,ENABLE);
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_SB)==RESET);//R START OK
        I2C_ClearFlag(I2C1,I2C_FLAG_SB);
        I2C_Send7bitAddress(I2C1,0xa1,I2C_Direction_Receiver);
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_ADDR)==RESET);//addr CMD OK
        I2C_ClearFlag(I2C1,I2C_FLAG_ADDR);
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BTF)==RESET);//等待數據接收完成
        delay(20);
        data=I2C_ReceiveData(I2C1);
        I2C_GenerateSTOP(I2C1,ENABLE);
        I2C_ClearFlag(I2C1,I2C_FLAG_BTF);
        return data;
}
void display(void)//顯示
{
  uchar second,t0,t1,t4,t5;
  second=i2creadbyte(0x40);
  t0=second/10;
  t1=second%10;
  t4=cf/10;
  t5=cf%10;
        maxdisp(leddula[t1],leddula[t0],0x01,0x01,0x01,0x01,leddula[t5],leddula[t4]);
}
void init7219(void)//顯示初始化
{
        sendword(0x0c,0x01);
        sendword(0x0a,0x01);
        sendword(0x0b,0x07);
        sendword(0x09,0x00);
        sendword(0x0f,0x00);
}
void delay(vu32 nCount)//廷時
{
        while(nCount--);
}
void sendbyte(uchar datt)
{
        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);
        SPI_I2S_SendData(SPI1,datt);
        delay(20);
}
void sendword(uchar addr,uchar dat)
{
        GPIO_ResetBits(GPIOA, GPIO_Pin_4);
  sendbyte(addr);
  sendbyte(dat);
        GPIO_SetBits(GPIOA, GPIO_Pin_4);
}
void clear7219(void)
{
  uchar i;
        for(i=1;i<9;i++)
                {
                        sendword(i,0x00);
                }
}
void maxdisp(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f,uchar g,uchar h)
{
                clear7219();
                sendword(0x01,a);  
                sendword(0x02,b);  
                sendword(0x03,c);  
                sendword(0x04,d);  
                sendword(0x05,e);  
                sendword(0x06,f);  
                sendword(0x07,g);  
                sendword(0x08,h);
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产视频1区2区 | 午夜播放器在线观看 | 成人亚洲网站 | 翔田千里一区二区 | 欧美成人精品一区二区男人看 | 精品av天堂毛片久久久借种 | 天天躁日日躁狠狠躁白人 | 伊人无码高清 | 欧美专区在线 | 亚洲国产精品va在线看黑人 | 欧美成人a | 欧美一级黄色免费看 | 日本在线一区二区 | 亚洲视频在线一区 | 欧美日韩中文字幕在线 | www.99精品| 伊人久久精品一区二区三区 | av毛片在线免费观看 | 欧美黑人体内she精在线观看 | 国产精品一区在线观看 | 91精品国产综合久久久久久蜜臀 | 99爱国产| 国产美女在线播放 | 精品久久久久久中文字幕 | 亚洲理论在线观看电影 | 中文字幕视频在线 | 久在线精品视频 | 亚洲成人一区二区三区 | 欧美激情精品久久久久久变态 | 国产乱精品一区二区三区 | 久久精品久久久久久 | 天天射影院 | 99成人| 亚洲高清视频一区 | 成人不卡 | 亚洲欧美日韩精品久久亚洲区 | 国产精品国产a级 | www.99re | 日韩在线国产精品 | 日韩三区 | 99精品国产一区二区青青牛奶 |