2023-12-11 21:45:06 +08:00
|
|
|
|
/*********************************************************************************************************************
|
2024-03-02 16:05:24 +08:00
|
|
|
|
* CH32V307VCT6 Opensourec Library <EFBFBD><EFBFBD><EFBFBD><EFBFBD>CH32V307VCT6 <EFBFBD><EFBFBD>Դ<EFBFBD>⣩<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڹٷ<EFBFBD> SDK <EFBFBD>ӿڵĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>
|
|
|
|
|
|
* Copyright (c) 2022 SEEKFREE <EFBFBD><EFBFBD><EFBFBD>ɿƼ<EFBFBD>
|
|
|
|
|
|
*
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>CH32V307VCT6 <EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
*
|
|
|
|
|
|
* CH32V307VCT6 <EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ը<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ᷢ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> GPL<EFBFBD><EFBFBD>GNU General Public License<EFBFBD><EFBFBD><EFBFBD><EFBFBD> GNUͨ<EFBFBD>ù<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* <EFBFBD><EFBFBD> GPL <EFBFBD>ĵ<EFBFBD>3<EFBFBD>棨<EFBFBD><EFBFBD> GPL3.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>κκ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>İ汾<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
*
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κεı<EFBFBD>֤
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD><EFBFBD>ʺ<EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD><EFBFBD>;<EFBFBD>ı<EFBFBD>֤
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD> GPL
|
|
|
|
|
|
*
|
|
|
|
|
|
* <EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬʱ<EFBFBD>յ<EFBFBD>һ<EFBFBD><EFBFBD> GPL <EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><https://www.gnu.org/licenses/>
|
|
|
|
|
|
*
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD> GPL3.0 <EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤Э<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD>İ汾
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӣ<EFBFBD>İ<EFBFBD><EFBFBD><EFBFBD> libraries/doc <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> GPL3_permission_statement.txt <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> libraries <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> LICENSE <EFBFBD>ļ<EFBFBD>
|
|
|
|
|
|
* <EFBFBD><EFBFBD>ӭ<EFBFBD><EFBFBD>λʹ<EFBFBD>ò<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>뱣<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿƼ<EFBFBD><EFBFBD>İ<EFBFBD>Ȩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
*
|
|
|
|
|
|
* <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> zf_driver_soft_iic
|
|
|
|
|
|
* <EFBFBD><EFBFBD>˾<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ɶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿƼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˾
|
|
|
|
|
|
* <EFBFBD>汾<EFBFBD><EFBFBD>Ϣ <EFBFBD>鿴 libraries/doc <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> version <EFBFBD>ļ<EFBFBD> <EFBFBD>汾˵<EFBFBD><EFBFBD>
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MounRiver Studio V1.8.1
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ̨ CH32V307VCT6
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> https://seekfree.taobao.com/
|
|
|
|
|
|
*
|
|
|
|
|
|
* <EFBFBD>ļ<EFBFBD>¼
|
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ע
|
|
|
|
|
|
* 2022-09-15 <EFBFBD><EFBFBD>W first version
|
|
|
|
|
|
********************************************************************************************************************/
|
2023-12-11 21:45:06 +08:00
|
|
|
|
|
|
|
|
|
|
#include "zf_common_debug.h"
|
|
|
|
|
|
|
|
|
|
|
|
#include "zf_driver_soft_iic.h"
|
|
|
|
|
|
|
2024-03-02 16:05:24 +08:00
|
|
|
|
#define SOFT_IIC_SDA_IO_SWITCH (0) // <20>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ SDA <20><><EFBFBD><EFBFBD> I/O <20>л<EFBFBD> 0-<2D><><EFBFBD><EFBFBD>Ҫ 1-<2D><>Ҫ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC <20><>ʱ
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> delay <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
|
|
|
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> soft_iic_delay(1);
|
|
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// static void soft_iic_delay (vuint32 delay)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
//{
|
|
|
|
|
|
// volatile uint32 count = delay;
|
|
|
|
|
|
// while(count --);
|
|
|
|
|
|
//}
|
2024-03-02 16:05:24 +08:00
|
|
|
|
#define soft_iic_delay(x) for (uint32 i = x; i--;)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC START <20>ź<EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> zf_driver_soft_iic.h <20><><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
|
|
|
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
static void soft_iic_start(soft_iic_info_struct *soft_iic_obj)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
gpio_high(soft_iic_obj->scl_pin); // SCL <20>ߵ<EFBFBD>ƽ
|
|
|
|
|
|
gpio_high(soft_iic_obj->sda_pin); // SDA <20>ߵ<EFBFBD>ƽ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
|
|
|
|
|
|
soft_iic_delay(soft_iic_obj->delay);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
gpio_low(soft_iic_obj->sda_pin); // SDA <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2023-12-11 21:45:06 +08:00
|
|
|
|
soft_iic_delay(soft_iic_obj->delay);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
gpio_low(soft_iic_obj->scl_pin); // SCL <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC STOP <20>ź<EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> zf_driver_soft_iic.h <20><><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
|
|
|
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> soft_iic_stop(soft_iic_obj);
|
|
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
static void soft_iic_stop(soft_iic_info_struct *soft_iic_obj)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
gpio_low(soft_iic_obj->sda_pin); // SDA <20>͵<EFBFBD>ƽ
|
|
|
|
|
|
gpio_low(soft_iic_obj->scl_pin); // SCL <20>͵<EFBFBD>ƽ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
|
|
|
|
|
|
soft_iic_delay(soft_iic_obj->delay);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
gpio_high(soft_iic_obj->scl_pin); // SCL <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2023-12-11 21:45:06 +08:00
|
|
|
|
soft_iic_delay(soft_iic_obj->delay);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
gpio_high(soft_iic_obj->sda_pin); // SDA <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2023-12-11 21:45:06 +08:00
|
|
|
|
soft_iic_delay(soft_iic_obj->delay);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC <20><><EFBFBD><EFBFBD> ACK/NAKC <20>ź<EFBFBD> <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> zf_driver_soft_iic.h <20><><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> ack ACK <20><>ƽ
|
|
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
|
|
|
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> soft_iic_send_ack(soft_iic_obj, 1);
|
|
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
static void soft_iic_send_ack(soft_iic_info_struct *soft_iic_obj, uint8 ack)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
gpio_low(soft_iic_obj->scl_pin); // SCL <20>͵<EFBFBD>ƽ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
|
2024-03-02 16:05:24 +08:00
|
|
|
|
if (ack) {
|
|
|
|
|
|
gpio_high(soft_iic_obj->sda_pin); // SDA <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
} else {
|
|
|
|
|
|
gpio_low(soft_iic_obj->sda_pin); // SDA <20><><EFBFBD><EFBFBD>
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
soft_iic_delay(soft_iic_obj->delay);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
gpio_high(soft_iic_obj->scl_pin); // SCL <20><><EFBFBD><EFBFBD>
|
2023-12-11 21:45:06 +08:00
|
|
|
|
soft_iic_delay(soft_iic_obj->delay);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
gpio_low(soft_iic_obj->scl_pin); // SCL <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
gpio_high(soft_iic_obj->sda_pin); // SDA <20><><EFBFBD><EFBFBD>
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC <20><>ȡ ACK/NAKC <20>ź<EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> zf_driver_soft_iic.h <20><><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8 ACK ״̬
|
|
|
|
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> soft_iic_wait_ack(soft_iic_obj);
|
|
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
static uint8 soft_iic_wait_ack(soft_iic_info_struct *soft_iic_obj)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
|
|
|
|
|
uint8 temp = 0;
|
2024-03-02 16:05:24 +08:00
|
|
|
|
gpio_low(soft_iic_obj->scl_pin); // SCL <20>͵<EFBFBD>ƽ
|
|
|
|
|
|
gpio_high(soft_iic_obj->sda_pin); // SDA <20>ߵ<EFBFBD>ƽ <20>ͷ<EFBFBD> SDA
|
2023-12-11 21:45:06 +08:00
|
|
|
|
#if SOFT_IIC_SDA_IO_SWITCH
|
|
|
|
|
|
gpio_set_dir(soft_iic_obj->sda_pin, GPI, GPI_FLOATING_IN);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
soft_iic_delay(soft_iic_obj->delay);
|
|
|
|
|
|
|
2024-03-02 16:05:24 +08:00
|
|
|
|
gpio_high(soft_iic_obj->scl_pin); // SCL <20>ߵ<EFBFBD>ƽ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
soft_iic_delay(soft_iic_obj->delay);
|
|
|
|
|
|
|
2024-03-02 16:05:24 +08:00
|
|
|
|
if (gpio_get_level((gpio_pin_enum)soft_iic_obj->sda_pin)) {
|
2023-12-11 21:45:06 +08:00
|
|
|
|
temp = 1;
|
|
|
|
|
|
}
|
2024-03-02 16:05:24 +08:00
|
|
|
|
gpio_low(soft_iic_obj->scl_pin); // SCL <20>͵<EFBFBD>ƽ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
#if SOFT_IIC_SDA_IO_SWITCH
|
|
|
|
|
|
gpio_set_dir(soft_iic_obj->sda_pin, GPO, GPO_OPEN_DTAIN);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
soft_iic_delay(soft_iic_obj->delay);
|
|
|
|
|
|
|
|
|
|
|
|
return temp;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC <20><><EFBFBD><EFBFBD> 8bit <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> zf_driver_soft_iic.h <20><><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> data <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8 ACK ״̬
|
|
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
static uint8 soft_iic_send_data(soft_iic_info_struct *soft_iic_obj, const uint8 data)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
|
|
|
|
|
uint8 temp = 0x80;
|
2024-03-02 16:05:24 +08:00
|
|
|
|
while (temp) {
|
|
|
|
|
|
// gpio_set_level(soft_iic_obj->sda_pin, data & temp);
|
2023-12-11 21:45:06 +08:00
|
|
|
|
((data & temp) ? (gpio_high(soft_iic_obj->sda_pin)) : (gpio_low(soft_iic_obj->sda_pin)));
|
|
|
|
|
|
temp >>= 1;
|
|
|
|
|
|
|
|
|
|
|
|
soft_iic_delay(soft_iic_obj->delay);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
gpio_high(soft_iic_obj->scl_pin); // SCL <20><><EFBFBD><EFBFBD>
|
2023-12-11 21:45:06 +08:00
|
|
|
|
soft_iic_delay(soft_iic_obj->delay);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
gpio_low(soft_iic_obj->scl_pin); // SCL <20><><EFBFBD><EFBFBD>
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
2024-03-02 16:05:24 +08:00
|
|
|
|
return ((soft_iic_wait_ack(soft_iic_obj) == 1) ? 0 : 1);
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC <20><>ȡ 8bit <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> zf_driver_soft_iic.h <20><><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> ack ACK <20><> NACK
|
|
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8 <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
static uint8 soft_iic_read_data(soft_iic_info_struct *soft_iic_obj, uint8 ack)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
|
|
|
|
|
uint8 data = 0x00;
|
|
|
|
|
|
uint8 temp = 8;
|
2024-03-02 16:05:24 +08:00
|
|
|
|
gpio_low(soft_iic_obj->scl_pin); // SCL <20>͵<EFBFBD>ƽ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
soft_iic_delay(soft_iic_obj->delay);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
gpio_high(soft_iic_obj->sda_pin); // SDA <20>ߵ<EFBFBD>ƽ <20>ͷ<EFBFBD> SDA
|
2023-12-11 21:45:06 +08:00
|
|
|
|
#if SOFT_IIC_SDA_IO_SWITCH
|
|
|
|
|
|
gpio_set_dir(soft_iic_obj->sda_pin, GPI, GPI_FLOATING_IN);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
2024-03-02 16:05:24 +08:00
|
|
|
|
while (temp--) {
|
|
|
|
|
|
gpio_low(soft_iic_obj->scl_pin); // SCL <20><><EFBFBD><EFBFBD>
|
2023-12-11 21:45:06 +08:00
|
|
|
|
soft_iic_delay(soft_iic_obj->delay);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
gpio_high(soft_iic_obj->scl_pin); // SCL <20><><EFBFBD><EFBFBD>
|
2023-12-11 21:45:06 +08:00
|
|
|
|
soft_iic_delay(soft_iic_obj->delay);
|
|
|
|
|
|
data = ((data << 1) | gpio_get_level((gpio_pin_enum)soft_iic_obj->sda_pin));
|
|
|
|
|
|
}
|
2024-03-02 16:05:24 +08:00
|
|
|
|
gpio_low(soft_iic_obj->scl_pin); // SCL <20>͵<EFBFBD>ƽ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
#if SOFT_IIC_SDA_IO_SWITCH
|
|
|
|
|
|
gpio_set_dir(soft_iic_obj->sda_pin, GPO, GPO_OPEN_DTAIN);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
soft_iic_delay(soft_iic_obj->delay);
|
|
|
|
|
|
soft_iic_send_ack(soft_iic_obj, ack);
|
|
|
|
|
|
return data;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC <20>ӿ<EFBFBD>д 8bit <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> zf_driver_soft_iic.h <20><><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> data Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
2023-12-11 21:45:06 +08:00
|
|
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> soft_iic_write_8bit_register(soft_iic_obj, 0x01);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
void soft_iic_write_8bit(soft_iic_info_struct *soft_iic_obj, const uint8 data)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, data);
|
|
|
|
|
|
soft_iic_stop(soft_iic_obj);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC <20>ӿ<EFBFBD>д 8bit <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> zf_driver_soft_iic.h <20><><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *data <20><><EFBFBD>ݴ<EFBFBD><DDB4>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> len <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
2023-12-11 21:45:06 +08:00
|
|
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> soft_iic_write_8bit_array(soft_iic_obj, data, 6);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
void soft_iic_write_8bit_array(soft_iic_info_struct *soft_iic_obj, const uint8 *data, uint32 len)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
|
|
|
|
|
zf_assert(data != NULL);
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
while (len--) {
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, *data++);
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
soft_iic_stop(soft_iic_obj);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC <20>ӿ<EFBFBD><D3BF><EFBFBD>д 16bit <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> zf_driver_soft_iic.h <20><><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> data Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
2023-12-11 21:45:06 +08:00
|
|
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> soft_iic_write_16bit(soft_iic_obj, 0x0101);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
void soft_iic_write_16bit(soft_iic_info_struct *soft_iic_obj, const uint16 data)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, (uint8)((data & 0xFF00) >> 8));
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, (uint8)(data & 0x00FF));
|
|
|
|
|
|
soft_iic_stop(soft_iic_obj);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC <20>ӿ<EFBFBD>д 16bit <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> zf_driver_soft_iic.h <20><><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *data <20><><EFBFBD>ݴ<EFBFBD><DDB4>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> len <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
2023-12-11 21:45:06 +08:00
|
|
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> soft_iic_write_16bit_array(soft_iic_obj, data, 6);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
void soft_iic_write_16bit_array(soft_iic_info_struct *soft_iic_obj, const uint16 *data, uint32 len)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
|
|
|
|
|
zf_assert(data != NULL);
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
while (len--) {
|
2023-12-11 21:45:06 +08:00
|
|
|
|
soft_iic_send_data(soft_iic_obj, (uint8)((*data & 0xFF00) >> 8));
|
2024-03-02 16:05:24 +08:00
|
|
|
|
soft_iic_send_data(soft_iic_obj, (uint8)(*data++ & 0x00FF));
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
soft_iic_stop(soft_iic_obj);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC <20>ӿ<EFBFBD><D3BF><EFBFBD><F2B4ABB8><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>д 8bit <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> zf_driver_soft_iic.h <20><><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> register_name <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> data Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
2023-12-11 21:45:06 +08:00
|
|
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> soft_iic_write_8bit_register(soft_iic_obj, 0x01, 0x01);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
void soft_iic_write_8bit_register(soft_iic_info_struct *soft_iic_obj, const uint8 register_name, const uint8 data)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, register_name);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, data);
|
|
|
|
|
|
soft_iic_stop(soft_iic_obj);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC <20>ӿ<EFBFBD><D3BF><EFBFBD><F2B4ABB8><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>д 8bit <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> zf_driver_soft_iic.h <20><><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> register_name <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *data <20><><EFBFBD>ݴ<EFBFBD><DDB4>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> len <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
2023-12-11 21:45:06 +08:00
|
|
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> soft_iic_write_8bit_registers(soft_iic_obj, 0x01, data, 6);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
void soft_iic_write_8bit_registers(soft_iic_info_struct *soft_iic_obj, const uint8 register_name, const uint8 *data, uint32 len)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
|
|
|
|
|
zf_assert(data != NULL);
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, register_name);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
while (len--) {
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, *data++);
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
soft_iic_stop(soft_iic_obj);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC <20>ӿ<EFBFBD><D3BF><EFBFBD><F2B4ABB8><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>д 16bit <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> zf_driver_soft_iic.h <20><><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> register_name <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> data Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
2023-12-11 21:45:06 +08:00
|
|
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> soft_iic_write_16bit_register(soft_iic_obj, 0x0101, 0x0101);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
void soft_iic_write_16bit_register(soft_iic_info_struct *soft_iic_obj, const uint16 register_name, const uint16 data)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, (uint8)((register_name & 0xFF00) >> 8));
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, (uint8)(register_name & 0x00FF));
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, (uint8)((data & 0xFF00) >> 8));
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, (uint8)(data & 0x00FF));
|
|
|
|
|
|
soft_iic_stop(soft_iic_obj);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC <20>ӿ<EFBFBD><D3BF><EFBFBD><F2B4ABB8><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>д 16bit <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> zf_driver_soft_iic.h <20><><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> register_name <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *data <20><><EFBFBD>ݴ<EFBFBD><DDB4>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> len <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
2023-12-11 21:45:06 +08:00
|
|
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> soft_iic_write_16bit_registers(soft_iic_obj, 0x0101, data, 6);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
void soft_iic_write_16bit_registers(soft_iic_info_struct *soft_iic_obj, const uint16 register_name, const uint16 *data, uint32 len)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
|
|
|
|
|
zf_assert(data != NULL);
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, (uint8)((register_name & 0xFF00) >> 8));
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, (uint8)(register_name & 0x00FF));
|
2024-03-02 16:05:24 +08:00
|
|
|
|
while (len--) {
|
2023-12-11 21:45:06 +08:00
|
|
|
|
soft_iic_send_data(soft_iic_obj, (uint8)((*data & 0xFF00) >> 8));
|
2024-03-02 16:05:24 +08:00
|
|
|
|
soft_iic_send_data(soft_iic_obj, (uint8)(*data++ & 0x00FF));
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
soft_iic_stop(soft_iic_obj);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC <20>ӿڶ<D3BF>ȡ 8bit <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> zf_driver_soft_iic.h <20><><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8 <20><><EFBFBD>ض<EFBFBD>ȡ<EFBFBD><C8A1> 8bit <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> soft_iic_read_8bit(soft_iic_obj);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
uint8 soft_iic_read_8bit(soft_iic_info_struct *soft_iic_obj)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
|
|
|
|
|
uint8 temp = 0;
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
|
|
|
|
|
temp = soft_iic_read_data(soft_iic_obj, 1);
|
|
|
|
|
|
soft_iic_stop(soft_iic_obj);
|
|
|
|
|
|
return temp;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC <20>ӿڴӴ<DAB4><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ȡ 8bit <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> zf_driver_soft_iic.h <20><><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> register_name <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *data Ҫ<><D2AA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݵĻ<DDB5><C4BB><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> len Ҫ<><D2AA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
2023-12-11 21:45:06 +08:00
|
|
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> soft_iic_read_8bit_array(soft_iic_obj, data, 8);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
void soft_iic_read_8bit_array(soft_iic_info_struct *soft_iic_obj, uint8 *data, uint32 len)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
|
|
|
|
|
zf_assert(data != NULL);
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
while (len--) {
|
|
|
|
|
|
*data++ = soft_iic_read_data(soft_iic_obj, len == 0);
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
soft_iic_stop(soft_iic_obj);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC <20>ӿڶ<D3BF>ȡ 16bit <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> zf_driver_soft_iic.h <20><><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> register_name <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
|
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint16 <20><><EFBFBD>ض<EFBFBD>ȡ<EFBFBD><C8A1> 16bit <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> soft_iic_read_16bit(soft_iic_obj);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
uint16 soft_iic_read_16bit(soft_iic_info_struct *soft_iic_obj)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
|
|
|
|
|
uint16 temp = 0;
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
|
|
|
|
|
temp = soft_iic_read_data(soft_iic_obj, 0);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
temp = ((temp << 8) | soft_iic_read_data(soft_iic_obj, 1));
|
2023-12-11 21:45:06 +08:00
|
|
|
|
soft_iic_stop(soft_iic_obj);
|
|
|
|
|
|
return temp;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC <20>ӿڶ<D3BF>ȡ 16bit <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> zf_driver_soft_iic.h <20><><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *data Ҫ<><D2AA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݵĻ<DDB5><C4BB><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> len Ҫ<><D2AA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
2023-12-11 21:45:06 +08:00
|
|
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> soft_iic_read_16bit_array(soft_iic_obj, data, 8);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
void soft_iic_read_16bit_array(soft_iic_info_struct *soft_iic_obj, uint16 *data, uint32 len)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
|
|
|
|
|
zf_assert(data != NULL);
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
while (len--) {
|
2023-12-11 21:45:06 +08:00
|
|
|
|
*data = soft_iic_read_data(soft_iic_obj, 0);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
*data = ((*data << 8) | soft_iic_read_data(soft_iic_obj, len == 0));
|
|
|
|
|
|
data++;
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
soft_iic_stop(soft_iic_obj);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC <20>ӿڴӴ<DAB4><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ȡ 8bit <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> zf_driver_soft_iic.h <20><><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> register_name <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
|
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8 <20><><EFBFBD>ض<EFBFBD>ȡ<EFBFBD><C8A1> 8bit <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> soft_iic_read_8bit_register(soft_iic_obj, 0x01);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
uint8 soft_iic_read_8bit_register(soft_iic_info_struct *soft_iic_obj, const uint8 register_name)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
|
|
|
|
|
uint8 temp = 0;
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, register_name);
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
|
|
|
|
|
temp = soft_iic_read_data(soft_iic_obj, 1);
|
|
|
|
|
|
soft_iic_stop(soft_iic_obj);
|
|
|
|
|
|
return temp;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC <20>ӿڴӴ<DAB4><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ȡ 8bit <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> zf_driver_soft_iic.h <20><><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> register_name <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *data Ҫ<><D2AA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݵĻ<DDB5><C4BB><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> len Ҫ<><D2AA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
2023-12-11 21:45:06 +08:00
|
|
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> soft_iic_read_8bit_registers(soft_iic_obj, 0x01, data, 8);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
void soft_iic_read_8bit_registers(soft_iic_info_struct *soft_iic_obj, const uint8 register_name, uint8 *data, uint32 len)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
|
|
|
|
|
zf_assert(data != NULL);
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, register_name);
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
while (len--) {
|
|
|
|
|
|
*data++ = soft_iic_read_data(soft_iic_obj, len == 0);
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
soft_iic_stop(soft_iic_obj);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC <20>ӿڴӴ<DAB4><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ȡ 16bit <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> zf_driver_soft_iic.h <20><><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> register_name <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
|
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint16 <20><><EFBFBD>ض<EFBFBD>ȡ<EFBFBD><C8A1> 16bit <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> soft_iic_read_16bit_register(soft_iic_obj, 0x0101);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
uint16 soft_iic_read_16bit_register(soft_iic_info_struct *soft_iic_obj, const uint16 register_name)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
|
|
|
|
|
uint16 temp = 0;
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, (uint8)((register_name & 0xFF00) >> 8));
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, (uint8)(register_name & 0x00FF));
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
|
|
|
|
|
temp = soft_iic_read_data(soft_iic_obj, 0);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
temp = ((temp << 8) | soft_iic_read_data(soft_iic_obj, 1));
|
2023-12-11 21:45:06 +08:00
|
|
|
|
soft_iic_stop(soft_iic_obj);
|
|
|
|
|
|
return temp;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC <20>ӿڴӴ<DAB4><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ȡ 16bit <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> zf_driver_soft_iic.h <20><><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> register_name <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *data Ҫ<><D2AA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݵĻ<DDB5><C4BB><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> len Ҫ<><D2AA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
2023-12-11 21:45:06 +08:00
|
|
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> soft_iic_read_16bit_registers(soft_iic_obj, 0x0101, data, 8);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
void soft_iic_read_16bit_registers(soft_iic_info_struct *soft_iic_obj, const uint16 register_name, uint16 *data, uint32 len)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
|
|
|
|
|
zf_assert(data != NULL);
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, (uint8)((register_name & 0xFF00) >> 8));
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, (uint8)(register_name & 0x00FF));
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
while (len--) {
|
2023-12-11 21:45:06 +08:00
|
|
|
|
*data = soft_iic_read_data(soft_iic_obj, 0);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
*data = ((*data << 8) | soft_iic_read_data(soft_iic_obj, len == 0));
|
|
|
|
|
|
data++;
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
soft_iic_stop(soft_iic_obj);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC <20>ӿڴ<D3BF><DAB4><EFBFBD> 8bit <20><><EFBFBD><EFBFBD> <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ȡ
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> zf_driver_soft_iic.h <20><><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *write_data <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> write_len <20><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *read_data <20><>ȡ<EFBFBD><C8A1><EFBFBD>ݴ<EFBFBD><DDB4>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> read_len <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
2023-12-11 21:45:06 +08:00
|
|
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> iic_transfer_8bit_array(IIC_1, addr, data, 64, data, 64);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
void soft_iic_transfer_8bit_array(soft_iic_info_struct *soft_iic_obj, const uint8 *write_data, uint32 write_len, uint8 *read_data, uint32 read_len)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
|
|
|
|
|
zf_assert(write_data != NULL);
|
|
|
|
|
|
zf_assert(read_data != NULL);
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
while (write_len--) {
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, *write_data++);
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-03-02 16:05:24 +08:00
|
|
|
|
if (read_len) {
|
2023-12-11 21:45:06 +08:00
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
while (read_len--) {
|
|
|
|
|
|
*read_data++ = soft_iic_read_data(soft_iic_obj, read_len == 0);
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
soft_iic_stop(soft_iic_obj);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC <20>ӿڴ<D3BF><DAB4><EFBFBD> 16bit <20><><EFBFBD><EFBFBD> <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ȡ
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> zf_driver_soft_iic.h <20><><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *write_data <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> write_len <20><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *read_data <20><>ȡ<EFBFBD><C8A1><EFBFBD>ݴ<EFBFBD><DDB4>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> read_len <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
2023-12-11 21:45:06 +08:00
|
|
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> iic_transfer_16bit_array(IIC_1, addr, data, 64, data, 64);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
void soft_iic_transfer_16bit_array(soft_iic_info_struct *soft_iic_obj, const uint16 *write_data, uint32 write_len, uint16 *read_data, uint32 read_len)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
|
|
|
|
|
zf_assert(write_data != NULL);
|
|
|
|
|
|
zf_assert(read_data != NULL);
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
while (write_len--) {
|
2023-12-11 21:45:06 +08:00
|
|
|
|
soft_iic_send_data(soft_iic_obj, (uint8)((*write_data & 0xFF00) >> 8));
|
2024-03-02 16:05:24 +08:00
|
|
|
|
soft_iic_send_data(soft_iic_obj, (uint8)(*write_data++ & 0x00FF));
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
2024-03-02 16:05:24 +08:00
|
|
|
|
if (read_len) {
|
2023-12-11 21:45:06 +08:00
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
while (read_len--) {
|
2023-12-11 21:45:06 +08:00
|
|
|
|
*read_data = soft_iic_read_data(soft_iic_obj, 0);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
*read_data = ((*read_data << 8) | soft_iic_read_data(soft_iic_obj, read_len == 0));
|
|
|
|
|
|
read_data++;
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
soft_iic_stop(soft_iic_obj);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC <20>ӿ<EFBFBD> SCCB ģʽ<C4A3><EFBFBD><F2B4ABB8><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>д 8bit <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> zf_driver_soft_iic.h <20><><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> register_name <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> data Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
2023-12-11 21:45:06 +08:00
|
|
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> soft_iic_sccb_write_register(soft_iic_obj, 0x01, 0x01);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
void soft_iic_sccb_write_register(soft_iic_info_struct *soft_iic_obj, const uint8 register_name, uint8 data)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, register_name);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, data);
|
|
|
|
|
|
soft_iic_stop(soft_iic_obj);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC <20>ӿ<EFBFBD> SCCB ģʽ<C4A3>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ȡ 8bit <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD> zf_driver_soft_iic.h <20><><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> register_name <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
|
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8 <20><><EFBFBD>ض<EFBFBD>ȡ<EFBFBD><C8A1> 8bit <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> soft_iic_sccb_read_register(soft_iic_obj, 0x01);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
uint8 soft_iic_sccb_read_register(soft_iic_info_struct *soft_iic_obj, const uint8 register_name)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
|
|
|
|
|
uint8 temp = 0;
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, register_name);
|
|
|
|
|
|
soft_iic_stop(soft_iic_obj);
|
|
|
|
|
|
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
|
|
|
|
|
temp = soft_iic_read_data(soft_iic_obj, 1);
|
|
|
|
|
|
soft_iic_stop(soft_iic_obj);
|
|
|
|
|
|
return temp;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IIC <20>ӿڳ<D3BF>ʼ<EFBFBD><CABC> Ĭ<><C4AC> MASTER ģʽ <20><><EFBFBD>ṩ SLAVE ģʽ
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> *soft_iic_obj <20><><EFBFBD><EFBFBD> IIC ָ<><D6B8><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>Žṹ<C5BD><E1B9B9><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> addr <20><><EFBFBD><EFBFBD> IIC <20><>ַ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫע<D2AA><D7A2> <20><><EFBFBD><D7BC>λ<EFBFBD><CEBB>ַ <20><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD> д<><D0B4>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> delay <20><><EFBFBD><EFBFBD> IIC <20><>ʱ <20><><EFBFBD><EFBFBD>ʱ<EFBFBD>Ӹߵ<D3B8>ƽʱ<C6BD><CAB1> Խ<><D4BD> IIC <20><><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> scl_pin <20><><EFBFBD><EFBFBD> IIC ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> zf_driver_gpio.h <20><> gpio_pin_enum ö<><C3B6><EFBFBD>嶨<EFBFBD><E5B6A8>
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> sda_pin <20><><EFBFBD><EFBFBD> IIC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> zf_driver_gpio.h <20><> gpio_pin_enum ö<><C3B6><EFBFBD>嶨<EFBFBD><E5B6A8>
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
|
2023-12-11 21:45:06 +08:00
|
|
|
|
// ʹ<><CAB9>ʾ<EFBFBD><CABE> soft_iic_init(&soft_iic_obj, addr, 100, B6, B7);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
// <20><>ע<EFBFBD><D7A2>Ϣ
|
2023-12-11 21:45:06 +08:00
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------
|
2024-03-02 16:05:24 +08:00
|
|
|
|
void soft_iic_init(soft_iic_info_struct *soft_iic_obj, uint8 addr, uint32 delay, gpio_pin_enum scl_pin, gpio_pin_enum sda_pin)
|
2023-12-11 21:45:06 +08:00
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
2024-03-02 16:05:24 +08:00
|
|
|
|
zf_assert(scl_pin != sda_pin); // <20><><EFBFBD>ѣ<EFBFBD> scl_pin <20><> sda_pin <20><>ô<EFBFBD><C3B4><EFBFBD><EFBFBD>ͬһ<CDAC><D2BB><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>
|
2023-12-11 21:45:06 +08:00
|
|
|
|
soft_iic_obj->scl_pin = scl_pin;
|
|
|
|
|
|
soft_iic_obj->sda_pin = sda_pin;
|
2024-03-02 16:05:24 +08:00
|
|
|
|
soft_iic_obj->addr = addr;
|
|
|
|
|
|
soft_iic_obj->delay = delay;
|
|
|
|
|
|
gpio_init(scl_pin, GPO, GPIO_HIGH, GPO_PUSH_PULL); // <20><>ȡ<EFBFBD><C8A1>ӦIO<49><4F><EFBFBD><EFBFBD> AF<41><46><EFBFBD>ܱ<EFBFBD><DCB1><EFBFBD>
|
|
|
|
|
|
gpio_init(sda_pin, GPO, GPIO_HIGH, GPO_OPEN_DTAIN); // <20><>ȡ<EFBFBD><C8A1>ӦIO<49><4F><EFBFBD><EFBFBD> AF<41><46><EFBFBD>ܱ<EFBFBD><DCB1><EFBFBD>
|
2023-12-11 21:45:06 +08:00
|
|
|
|
}
|
2024-03-02 16:05:24 +08:00
|
|
|
|
void eep_soft_iic_read_8bit_registers(soft_iic_info_struct *soft_iic_obj, const uint8 register_name_h, const uint8 register_name_l, uint8 *data, uint32 len)
|
|
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
|
|
|
|
|
zf_assert(data != NULL);
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, register_name_h);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, register_name_l);
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1 | 0x01);
|
|
|
|
|
|
while (len--) {
|
|
|
|
|
|
*data++ = soft_iic_read_data(soft_iic_obj, len == 0);
|
|
|
|
|
|
}
|
|
|
|
|
|
soft_iic_stop(soft_iic_obj);
|
|
|
|
|
|
}
|
|
|
|
|
|
void eep_soft_iic_write_8bit_registers(soft_iic_info_struct *soft_iic_obj, const uint8 register_name_h, const uint8 register_name_l, const uint8 *data, uint32 len)
|
|
|
|
|
|
{
|
|
|
|
|
|
zf_assert(soft_iic_obj != NULL);
|
|
|
|
|
|
zf_assert(data != NULL);
|
|
|
|
|
|
soft_iic_start(soft_iic_obj);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, soft_iic_obj->addr << 1);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, register_name_h);
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, register_name_l);
|
|
|
|
|
|
while (len--) {
|
|
|
|
|
|
soft_iic_send_data(soft_iic_obj, *data++);
|
|
|
|
|
|
}
|
|
|
|
|
|
soft_iic_stop(soft_iic_obj);
|
|
|
|
|
|
}
|