分享刚刚调试成功的RX8025T的读写代码

2020-01-13 18:22发布

本帖最后由 wxdn 于 2019-5-22 04:46 编辑

调试了好久没有调出来,实在是没有办法,用STC8的内置IIC,一次通过了,后来才在STC15里面用端口模拟出来,分享给大家。
/**********************************************************************
主芯片:STC15W4K32S4   QFP-48  芯片供电:3.30V  时钟:内置11.0592M  工程建立日期:2019.05.22                       
**********************************************************************/
#include"RX8025.h"
#include "STC15F2K60S2.H"
#include"delays.h"
sbit scl  = P2^4;//
sbit sda  = P2^5;//
/*                 秒        分钟      小时      日       月      星期    */
unsigned char TIM_Second,TIM_Minute,TIM_Hour,TIM_Date,TIM_Month,TIM_Week;
unsigned int TIM_Year; //年

void Delay_us(unsigned char i)
{
    while(i--);
}

void start(void)
{
    scl=1;
        Delay_us(5);
        sda=0;   
    Delay_us(5);
        scl=0;
}

void stop(void)
{
    sda=0;
    Delay_us(5);
    scl=1;
    Delay_us(5);
    sda=1;
    Delay_us(5);
}

void iicinit(void)
{
        scl=1;
        Delay_us(5);
        sda=1;       
}

unsigned char iicwr_byte(unsigned char dat)//写数据
{
        unsigned char i;
        sda=1;       
        for(i=0;i<8;i++)
        {
                scl=0;
                Delay_us(2);
                if(dat&0x80)
                {
                        sda=1;
                }
                else
                {
                        sda=0;
                }

                dat<<=1;               
                scl=1;
                Delay_us(5);
        }
        scl=0;
        Delay_us(5);
        sda=1;
        scl=1;
        Delay_us(5);
        scl=0;
        i=sda;
        return i;
}

unsigned char iicre_byte(unsigned char x)//读数据 x:1为ACK,x:0为NACK
{
        unsigned char i,dat;
        sda=1;
        for(i=0;i<8;i++)
        {
                scl=0;
                Delay_us(2);
                dat<<=1;
                dat|=sda;
                scl=1;
                Delay_us(5);
        }
        scl=0;       
        if(x)
        {
                sda=0;       
        }
        else
        {
                sda=1;
        }
        Delay_us(5);
        scl=1;
        Delay_us(5);
        scl=0;
        return dat;
}

void READ_TIM(void)
{
        start();
        iicwr_byte(0x64);
        Delay_us(50);
        iicwr_byte(0x00);
        Delay_us(50);
        start();                  
        iicwr_byte(0x65);
        Delay_us(50);
        TIM_Second=iicre_byte(1);
        Delay_us(50);
        TIM_Minute=iicre_byte(1);
        Delay_us(50);
        TIM_Hour=iicre_byte(0);
        Delay_us(50);
        stop();                       
}

void READ_Date(void)
{
        start();                 
        iicwr_byte(0x64);  
        Delay_us(50);
        iicwr_byte(0x03);
        Delay_us(50);
        start();                  
        iicwr_byte(0x65);  
        Delay_us(50);
        TIM_Week=iicre_byte(1);
        Delay_us(50);
        TIM_Date=iicre_byte(1);
        Delay_us(50);
        TIM_Month=iicre_byte(0);
        Delay_us(50);
        stop();
}
void SET_YEAR(unsigned char YE)
{
        start();                  
        iicwr_byte(0x64);  
        Delay_us(50);
        iicwr_byte(0x06);
        Delay_us(50);
        iicwr_byte(YE);
        Delay_us(50);
        stop();
}
void SET_DAY(unsigned char M,unsigned char D)
{
        start();                  
        iicwr_byte(0x64);  
        Delay_us(50);
        iicwr_byte(0x04);  
        Delay_us(50);
        iicwr_byte(D);  
        Delay_us(50);
        iicwr_byte(M);  
        Delay_us(50);
        stop();
}
void SET_WEEK(unsigned char W)
{
        start();                  
        iicwr_byte(0x64);  
        Delay_us(50);
        iicwr_byte(0x03);  
        Delay_us(50);
        iicwr_byte(W);
        Delay_us(50);
        stop();
}
void SET_TIME(unsigned char H,unsigned char M,unsigned char S)
{
        start();                  
        iicwr_byte(0x64);
        Delay_us(50);
        iicwr_byte(0x00);
        Delay_us(50);
        iicwr_byte(S);  
        Delay_us(50);
        iicwr_byte(M);
        Delay_us(50);
        iicwr_byte(H);
        Delay_us(50);
        stop();
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
meirenai
2020-01-14 11:35
分享个软件 I2C 代码吧,不同的I2C芯片很好移植,我用这个代码驱动了好多I2C器件了。AT24Cxx、MPU6050、PCF8563、SE8025、DS3231、SHT31

softiic.h
  1. #ifndef _SOFT_IIC_H_
  2. #define _SOFT_IIC_H_

  3. #ifdef __cplusplus
  4. extern "C"
  5. {
  6. #endif

  7. #include <stdint.h>

  8.     typedef struct
  9.     {
  10.         uint8_t dev_addr;

  11.         //配置clk dat 端口操作接口
  12.         void (*clk)(uint8_t chByte);
  13.         void (*dat)(uint8_t chByte);
  14.         uint8_t (*get_dat)(void);

  15.         void (*delay)(void); //延时函数
  16.     } softiic_t;

  17.     extern void softiic_interface_register(softiic_t *iic,
  18.                                            uint8_t dev_addr,
  19.                                            void (*clk)(uint8_t chByte),
  20.                                            void (*dat)(uint8_t chByte),
  21.                                            uint8_t (*get_dat)(void),
  22.                                            void (*delay)(void));

  23.     extern void softiic_start(softiic_t *iic);
  24.     extern void softiic_stop(softiic_t *iic);
  25.     extern void softiic_tack(softiic_t *iic);
  26.     extern void softiic_tnack(softiic_t *iic);
  27.     extern int softiic_ckack(softiic_t *iic);

  28.     extern void softiic_write_byte(softiic_t *iic, uint8_t chByte);
  29.     extern void softiic_read_byte(softiic_t *iic, uint8_t *pchByte);

  30.     extern void softiic_write_buff(softiic_t *iic, uint8_t addr, uint16_t len, uint8_t *buff);
  31.     extern void softiic_read_buff(softiic_t *iic, uint8_t addr, uint16_t len, uint8_t *buff);

  32.     extern void softiic_write_bits(softiic_t *iic, uint8_t addr, uint8_t mask, uint8_t data);
  33.     extern void softiic_read_bits(softiic_t *iic, uint8_t addr, uint8_t mask, uint8_t *data);

  34. #ifdef __cplusplus
  35. }
  36. #endif

  37. #endif
复制代码

softiic.c
  1. #include "softiic.h"

  2. void softiic_start(softiic_t *iic)
  3. {
  4.     //  iic->clk(0);
  5.     //  iic->delay();
  6.     iic->dat(1);
  7.     iic->delay();
  8.     iic->clk(1);
  9.     iic->delay();
  10.     iic->dat(0);
  11.     iic->delay();
  12.     iic->clk(0);
  13.     iic->delay();
  14. }

  15. void softiic_stop(softiic_t *iic)
  16. {
  17.     iic->dat(0);
  18.     iic->delay();
  19.     iic->clk(1);
  20.     iic->delay();
  21.     iic->dat(1);
  22.     iic->delay();
  23.     //  iic->dat(0);
  24.     //  iic->delay();
  25.     iic->clk(0);
  26.     iic->delay();
  27. }

  28. void softiic_tack(softiic_t *iic)
  29. {
  30.     iic->clk(0);
  31.     iic->delay();
  32.     iic->dat(0);
  33.     iic->delay();
  34.     iic->clk(1);
  35.     iic->delay();
  36.     iic->clk(0);
  37.     iic->delay();
  38. }

  39. void softiic_tnack(softiic_t *iic)
  40. {
  41.     iic->clk(0);
  42.     iic->delay();
  43.     iic->dat(1);
  44.     iic->delay();
  45.     iic->clk(1);
  46.     iic->delay();
  47.     iic->clk(0);
  48.     iic->delay();
  49. }

  50. // NOTE 注意检测延时
  51. int softiic_ckack(softiic_t *iic)
  52. {
  53.     uint16_t timeout = 0;

  54.     iic->dat(1);
  55.     iic->delay();
  56.     iic->clk(1);
  57.     iic->delay();
  58.     while (iic->get_dat()) {
  59.         timeout++;
  60.         if (timeout >= 10) {
  61.             iic->clk(0);
  62.             iic->delay();
  63.             return 1;
  64.         }
  65.     }
  66.     iic->clk(0);
  67.     iic->delay();

  68.     return 0;
  69. }

  70. void softiic_write_byte(softiic_t *iic, uint8_t chByte)
  71. {
  72.     uint8_t i;

  73.     for (i = 0; i < 8; i++) {
  74.         if (chByte & 0x80) {
  75.             iic->dat(1);
  76.         } else {
  77.             iic->dat(0);
  78.         }
  79.         iic->delay();
  80.         iic->clk(1);
  81.         iic->delay();
  82.         iic->clk(0);
  83.         iic->delay();
  84.         chByte = chByte << 1;
  85.     }
  86. }

  87. void softiic_read_byte(softiic_t *iic, uint8_t *pchByte)
  88. {
  89.     uint8_t i;

  90.     for (i = 0; i < 8; i++) {
  91.         iic->dat(1);
  92.         iic->delay();
  93.         iic->clk(1);
  94.         iic->delay();
  95.         *pchByte = *pchByte << 1;
  96.         if (iic->get_dat()) {
  97.             *pchByte = *pchByte | 0x01;
  98.         }
  99.         iic->delay();
  100.         iic->clk(0);
  101.         iic->delay();
  102.     }
  103. }

  104. void softiic_read_buff(softiic_t *iic, uint8_t addr, uint16_t len, uint8_t *buff)
  105. {
  106.     uint8_t chByte;

  107.     softiic_start(iic);
  108.     softiic_write_byte(iic, iic->dev_addr);
  109.     softiic_ckack(iic);

  110.     softiic_write_byte(iic, addr);
  111.     softiic_ckack(iic);

  112.     softiic_start(iic);
  113.     softiic_write_byte(iic, iic->dev_addr | 0x01);
  114.     softiic_ckack(iic);
  115.     while (len) {
  116.         softiic_read_byte(iic, &chByte);
  117.         *buff = chByte;
  118.         if (len == 1) {
  119.             softiic_tnack(iic);
  120.         } else {
  121.             softiic_tack(iic);
  122.         }
  123.         buff++;
  124.         len--;
  125.     }
  126.     softiic_stop(iic);
  127. }

  128. void softiic_write_buff(softiic_t *iic, uint8_t addr, uint16_t len, uint8_t *buff)
  129. {
  130.     softiic_start(iic);
  131.     softiic_write_byte(iic, iic->dev_addr);
  132.     softiic_ckack(iic);

  133.     softiic_write_byte(iic, addr);
  134.     softiic_ckack(iic);

  135.     while (len) {
  136.         softiic_write_byte(iic, *buff);
  137.         softiic_ckack(iic);
  138.         buff++;
  139.         len--;
  140.     }
  141.     softiic_stop(iic);
  142. }

  143. void softiic_write_bits(softiic_t *iic, uint8_t addr, uint8_t mask, uint8_t data)
  144. {
  145.     uint8_t chByte;

  146.     softiic_read_buff(iic, addr, 1, &chByte);
  147.     chByte &= ~mask;
  148.     chByte |= data;
  149.     softiic_write_buff(iic, addr, 1, &chByte);
  150. }

  151. void softiic_read_bits(softiic_t *iic, uint8_t addr, uint8_t mask, uint8_t *data)
  152. {
  153.     uint8_t chByte;

  154.     softiic_read_buff(iic, addr, 1, &chByte);
  155.     chByte &= mask;
  156.     *data = chByte;
  157. }

  158. /**
  159. * @brief  IIC接口注册函数
  160. * @note
  161. * @param  *iic:
  162. * @param  (*clk:
  163. * @retval None
  164. */
  165. void softiic_interface_register(softiic_t *iic,
  166.                                 uint8_t dev_addr,
  167.                                 void (*clk)(uint8_t chByte),
  168.                                 void (*dat)(uint8_t chByte),
  169.                                 uint8_t (*get_dat)(void),
  170.                                 void (*delay)(void))
  171. {
  172.     iic->clk = clk;
  173.     iic->dat = dat;
  174.     iic->get_dat = get_dat;
  175.     iic->delay = delay;

  176.     iic->dev_addr = dev_addr;
  177. }
复制代码

rtc_se8025.h
  1. #ifndef __RTC_SE8025_H__
  2. #define __RTC_SE8025_H__

  3. #include "app.h"
  4. #include "softiic.h"

  5. extern void rtc_se8025_init(void);
  6. extern void rtc_se8025_task(void);

  7. extern void rtc_se8025_set_time(uint8_t *buff);

  8. #endif
复制代码

rtc_se8025.c
  1. #include "rtc_se8025.h"

  2. #define RTC_TIME(n) ((n) / 100)

  3. #if 1
  4. #define SE8025_DEBUG(...)
  5. #else
  6. #define SE8025_DEBUG(...)                                                                                             
  7.     do {                                                                                                               
  8.         debug_printf("[RTC]");                                                                                         
  9.         debug_printf(__VA_ARGS__);                                                                                    
  10.     } while (0)
  11. #endif

  12. #define BCD2CONVER(__VALUE, __MAST) ((__VALUE & (__MAST)) >> 4) * 10 + ((__VALUE)&0X0F) // BCD转HEX

  13. #define SCL_H()                                                                                                        
  14.     do {                                                                                                               
  15.         HAL_GPIO_WritePin(RTC_CLK_PIN_GPIO_Port, RTC_CLK_PIN_Pin, GPIO_PIN_SET);                                       
  16.     } while (0)
  17. #define SCL_L()                                                                                                        
  18.     do {                                                                                                               
  19.         HAL_GPIO_WritePin(RTC_CLK_PIN_GPIO_Port, RTC_CLK_PIN_Pin, GPIO_PIN_RESET);                                    
  20.     } while (0)
  21. #define SDA_H()                                                                                                        
  22.     do {                                                                                                               
  23.         HAL_GPIO_WritePin(RTC_DAT_PIN_GPIO_Port, RTC_DAT_PIN_Pin, GPIO_PIN_SET);                                       
  24.     } while (0)
  25. #define SDA_L()                                                                                                        
  26.     do {                                                                                                               
  27.         HAL_GPIO_WritePin(RTC_DAT_PIN_GPIO_Port, RTC_DAT_PIN_Pin, GPIO_PIN_RESET);                                    
  28.     } while (0)
  29. #define SDA_IS_H() (HAL_GPIO_ReadPin(RTC_DAT_PIN_GPIO_Port, RTC_DAT_PIN_Pin) != GPIO_PIN_RESET)

  30. static void clk(uint8_t chByte)
  31. {
  32.     if (chByte) {
  33.         SCL_H();
  34.     } else {
  35.         SCL_L();
  36.     }
  37. }

  38. static void dat(uint8_t chByte)
  39. {
  40.     if (chByte) {
  41.         SDA_H();
  42.     } else {
  43.         SDA_L();
  44.     }
  45. }

  46. static uint8_t get_dat(void)
  47. {
  48.     if (SDA_IS_H()) {
  49.         return 1;
  50.     } else {
  51.         return 0;
  52.     }
  53. }

  54. static void delay()
  55. {
  56.     uint16_t i = 2;
  57.     while (i--)
  58.         ;
  59. }

  60. softiic_t se8025;

  61. void rtc_se8025_set_time(uint8_t *buff)
  62. {
  63.     uint8_t array[7];

  64.     array[6] = (buff[0] / 10 * 16) + (buff[0] % 10);
  65.     array[5] = (buff[1] / 10 * 16) + (buff[1] % 10);
  66.     array[4] = (buff[2] / 10 * 16) + (buff[2] % 10);
  67.     array[2] = (buff[3] / 10 * 16) + (buff[3] % 10);
  68.     array[1] = (buff[4] / 10 * 16) + (buff[4] % 10);
  69.     array[0] = (buff[5] / 10 * 16) + (buff[5] % 10);
  70.     array[3] = 0;
  71.     softiic_write_buff(&se8025, 0, 7, array);
  72. }

  73. void rtc_se8025_read_time()
  74. {
  75.     uint8_t buff[16];

  76.     softiic_read_buff(&se8025, 0, 16, buff);

  77.     run_param.dateTime[5] = BCD2CONVER(buff[0], 0X70); //秒
  78.     run_param.dateTime[4] = BCD2CONVER(buff[1], 0X70); //分
  79.     run_param.dateTime[3] = BCD2CONVER(buff[2], 0X30); //时

  80.     // run_param.dateTime[6] = buff[3];                   //星期
  81.     run_param.dateTime[2] = BCD2CONVER(buff[4], 0X30); //日
  82.     run_param.dateTime[1] = BCD2CONVER(buff[5], 0X10); //月
  83.     run_param.dateTime[0] = BCD2CONVER(buff[6], 0XF0); //年
  84. }

  85. void rtc_se8025_init(void)
  86. {
  87.     softiic_interface_register(&se8025, 0x64, clk, dat, get_dat, delay);

  88.     rtc_se8025_read_time();

  89.     debug_printf("[RTC]20%02d-%02d-%02d %02d:%02d:%02d ", run_param.dateTime[0], run_param.dateTime[1],
  90.                  run_param.dateTime[2], run_param.dateTime[3], run_param.dateTime[4], run_param.dateTime[5]);
  91. }

  92. void rtc_se8025_task(void)
  93. {
  94.     static uint16_t s_hwTimeCnt = 0;

  95.     rtc_se8025_read_time();

  96.     if (++s_hwTimeCnt >= RTC_TIME(1000)) {
  97.         s_hwTimeCnt = 0;
  98.         if (run_param.timeSyncCntDown) {
  99.             run_param.timeSyncCntDown--;
  100.         }

  101.         SE8025_DEBUG("20%02d-%02d-%02d %02d:%02d:%02d ", run_param.dateTime[0], run_param.dateTime[1],
  102.                      run_param.dateTime[2], run_param.dateTime[3], run_param.dateTime[4], run_param.dateTime[5]);

  103.         LED_FB_TOGGLE(LED_DBG2_PIN_GPIO_Port, LED_DBG2_PIN_Pin);
  104.     }
  105. }
复制代码

一周热门 更多>